Обобщенные классы
Ниже приведена общая форма объявления обобщенного класса:
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. В ходе выполнения этих операций обобщения исключают необходимость обращаться к приведению типов и проверять соответствие типов в коде вручную.
Комментарии