Будут ли универсальные классы

Закрыть ... [X]

Под универсальностью (generality) понимается способность класса объявлять используемые им типы как параметры. Класс с параметрами, классы задающими типы, называется универсальным классом (generic class).

Объявить класс C# универсальным просто: для этого достаточно указать в объявлении класса, какие из используемых им типов являются параметрами. Список типовых параметров класса, заключенный в угловые скобки, добавляется к имени класса:

class MyClass<T1,... Tn> (...)

Как и всякие формальные параметры, Ti являются именами (идентификаторами). В описании класса эти имена могут задавать типы некоторых полей класса, типы параметров и возвращаемых значений методов класса. В некоторый момент формальные имена типов будут заменены фактическими параметрами, представляющими уже конкретные типы – имена встроенных классов, классов библиотеки FCL, классов, определенных пользователем.

В языке C# универсальными могут быть как классы, так и другие пользовательские типы: интерфейсы, структуры, делегаты, события.

Специальным частным случаем универсального класса является класс, не объявляющий сам параметров, но разрешающий делать это своим методам. Рассмотрим универсальность этого частного случая. Вот как выглядит класс, содержащий универсальный метод swap: class Change {

static public void Swap<T>(ref T x1, ref T x2){ T temp;

temp = x1; x1 = x2; x2 = temp;

}

}

Как видно, сам класс в данном случае нс имеет параметров, задающих тип, но зато универсальным является статический метод класса swap, имеющий родовой параметр типа Т. Этому типу принадлежат параметры метода и локальная переменная temp. Всякий раз при вызове метода ему, наряду с фактическими параметрами, будет передаваться и фактический тип, заменяющий тип Т в описании метода.

Рассмотрим тестирующий метод из класса Testing, в котором используется вызов метода swap для различных типов переменных:

public void TestSwap(){ int x1 = 5, x2 = 7;

Console.WriteLine ("до обмена: x1={0}, x2={1}",x1, x2);

Change.Swap<int>(ref x1, ref x2);

Console.WriteLine ("после обмена: x1={0}, x2={1}", x1, x2);

Person persl = new Personf("Свалов", 25, 1500);

Person pers2 = new Person("Павлов", 35, 2100);

Console.WriteLine("до обмена:"); persl.PrintPerson(); pers2.PrintPerson();

Change.Swap<Person>(ref persl, ref pers2);

Console.WriteLine("nocne обмена:"); persl.PrintPerson(); pers2.PrintPerson();

}

Обратите внимание на строки, осуществляющие вызов метода: Change.Swap<int>(ref x1, ref x2);

Change.Swap<Person>(ref persl, ref pers2);

В момент вызова методу передаются фактические типы и фактические параметры. В данном примере в качестве фактических типов использовались встроенный тип int и тип Person, определенный пользователем.

Универсальность потребовала введения в библиотеку FCL соответствующих классов, интерфейсов, делегатов и методов классов, обладающих этим свойством. В частности, в библиотеке FCL создано пространство имен System.Collections.Generic, в которое включены обобщенные классы коллекций.


Поделись с друзьями



Рекомендуем посмотреть ещё:



Судьбу универсальных классов и троечников в старшей школе
Стих для владимира на день рожденияУниверсальные боксы с секциямиФасон платья гостя на свадьбуРазбитый стакан на свадьбуСлон все для свадьбы


Будут ли универсальные классы Будут ли универсальные классы Будут ли универсальные классы Будут ли универсальные классы Будут ли универсальные классы Будут ли универсальные классы Будут ли универсальные классы Будут ли универсальные классы Будут ли универсальные классы


ШОКИРУЮЩИЕ НОВОСТИ