Да си припомним: какво са класовете и обектите?


MethodWithParamsOfT(T param)



страница80/84
Дата03.01.2022
Размер0.54 Mb.
#112941
ТипПрограма
1   ...   76   77   78   79   80   81   82   83   84
Класове
Свързани:
Изпитна тема1, Изпитна тема2
MethodWithParamsOfT(T param)

-     Като резултат от изпълнението на метода:

Т MethodWithReturnTypeOfT(
)


Както вече се досещаме, използвайки нашия пример, можем да адаптира­ме методите Shelter и Release, съответно:

-     Като метод с параметър от неизвестен тип Т:



public void Shelter(T newAnimal)

{

// Method's body goes here ...



}

-     И метод, който връща резултат от неизвестен тип Т:

public T Release(int i)

{

// Method's body goes here ...



}

Както вече знаем, когато създадем обект от нашия клас приют и неиз­вестния тип го заменим с някой конкретен тип (например Cat), по време на изпълнение на програмата горните методи ще имат следния вид:

-     Параметърът на метода Shelter ще бъде от тип Cat:



public void Shelter(Cat newAnimal)

{

// Method's body goes here ...



}

-     Методът Release ще връща резултат от тип Cat:

public Cat Release(int i)

{

// Method's body goes here ...



}

Типизирането (generics) зад кулисите

Преди да продължим, нека обясним какво става в паметта на компютъра, когато работим с типизирани класове.



Първо декларираме нашия типизиран клас MyClass (generic class description в горната схема). След това компилаторът транслира нашия код на междинен език (MSIL), като транслираният код, съдържа инфор­мация, че класът е типизиран, т.е. работи с неопределени до момента типове. По време на изпълнение, когато някой се опитва да работи с нашия типизиран клас и да го използва с конкретен тип, се създава ново описание на клас (concrete type class description в схемата по-горе), което е идентично с това на типизирания клас, с тази разлика, че навсякъде където е използвано T, сега се заменя с конкретния тип. Например ако се опитаме да използваме MyClass, навсякъде, където в нашия код e използван неизвестния параметър T, ще бъде заме­нен с int. Едва след това, можем да създадем обект от типизирания клас с конкретен тип int. Особеното тук е, че за да се създаде този обект, ще се използва описанието на класа, което бе създадено междувременно (concrete type class description). Инстанцирането на шаблонен клас по дадени конкретни типове на неговите параметри се нарича "специали­зация на тип" или "разгъване на шаблонен клас".

Използвайки нашия пример, ако създадем обект от тип AnimalShelter, който работи само с обекти от тип Dog, ако се опитаме да добавим обект от тип Cat, това ще доведе до грешка при компилация почти идентична с грешките, които бяха изведени при опит за добавяне на обект от тип Cat, към обект от тип AnimalShelter, който създадохме в първата подсекция "Приют за бездомни животни – пример":

public static void Main()

{

AnimalShelter dogsShelter = new AnimalShelter(10);



 

Cat cat1 = new Cat();

 

dogsShelter.Shelter(cat1);



}

Както се очакваше, получаваме следните съобщения:

The best overloaded method match for 'AnimalShelter< Dog>.Shelter(Dog)' has some invalid arguments

 

Argument 1: cannot convert from 'Cat' to 'Dog'



Типизиране на методи

Подобно на класовете, когато при декларацията на един метод, не можем да кажем от какъв тип ще са параметрите му, можем да типизираме метода. Съответно, указването на конкретния тип ще стане по време на извикване на метода, заменяйки непознатият тип с конкретен, както направихме при класовете.

Типизирането на метод се прави, като веднага след името и преди отва­рящата кръгла скоба на метода, се добави , където K е заместителят на типа, който ще се използва в последствие:



Сподели с приятели:
1   ...   76   77   78   79   80   81   82   83   84




©obuch.info 2024
отнасят до администрацията

    Начална страница