Обобщенные классы
34C# --- Руководство по C# --- Обобщенные классы
Ниже приведена общая форма объявления обобщенного класса:
class имя_класса<список_параметров_типа> { // ...
А вот как выглядит синтаксис объявления ссылки на обобщенный класс:
имя_класса<список_аргументов_типа> имя_переменной = new имя_класса<список_параметров_типа> (список_аргументов_конструктора);
Давайте рассмотрим пример использования нескольких обобщенных классов:
namespace ConsoleApplication1
{
// Создадим обобщенный класс имеющий параметр типа T
class MyObj<T>
{
T obj;
public MyObj(T obj)
{
this.obj = obj;
}
public void objectType()
{
Console.WriteLine("Тип объекта: " + typeof(T));
}
}
// Обобщенный класс с несколькими параметрами
class MyObjects<T, V, E>
{
T obj1;
V obj2;
E obj3;
public MyObjects(T obj1, V obj2, E obj3)
{
this.obj1 = obj1;
this.obj2 = obj2;
this.obj3 = obj3;
}
public void objectsType()
{
Console.WriteLine("\nТип объекта 1: " + typeof(T)+
"\nТип объекта 2: " + typeof(V) +
"\nТип объекта 3: " + typeof(E));
}
}
class Program
{
static void Main()
{
// Создадим экземпляр обобщенного класса типа int
MyObj<int> obj1 = new MyObj<int>(25);
obj1.objectType();
MyObjects<string, byte, decimal> obj2 = new MyObjects<string, byte, decimal>("Alex",26,12.333m);
obj2.objectsType();
Console.ReadLine();
}
}
}

Когда для класса MyObj указывается аргумент типа, например int или string, то создается так называемый в C# закрыто сконструированный тип. В частности, MyObj<int> является закрыто сконструированным типом. Ведь, по существу, такой обобщенный тип, как MyObj<T>, является абстракцией. И только после того, как будет сконструирован конкретный вариант, например MyObj<int>, создается конкретный тип. А конструкция, подобная MyObj<T>, называется в C# открыто сконструированным типом, поскольку в ней указывается параметр типа Т, но не такой конкретный тип, как int.
В C# чаще определяются такие понятия, как открытый и закрытый типы. Открытым типом считается такой параметр типа или любой обобщенный тип, для которого аргумент типа является параметром типа или же включает его в себя. А любой тип, не относящийся к открытому, считается закрытым. Сконструированным типом считается такой обобщенный тип, для которого предоставлены все аргументы типов. Если все эти аргументы относятся к закрытым типам, то такой тип считается закрыто сконструированным. А если один или несколько аргументов типа относятся к открытым типам, то такой тип считается открыто сконструированным.
И еще один момент. В связи с изложенным выше возникает следующий резонный вопрос: если аналогичные функциональные возможности обобщенного класса MyObj можно получить и без обобщений, просто указав объект как тип данных и выполнив надлежащее приведение типов, то какая польза от того, что класс MyObj делается обобщенным? Ответ на этот вопрос заключается в том, что обобщения автоматически обеспечивают типовую безопасность всех операций, затрагивающих класс MyObj. В ходе выполнения этих операций обобщения исключают необходимость обращаться к приведению типов и проверять соответствие типов в коде вручную.