Обобщенные классы

34

Ниже приведена общая форма объявления обобщенного класса:

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();
        }
    }
}
Использование обобщений C#

Когда для класса MyObj указывается аргумент типа, например int или string, то создается так называемый в C# закрыто сконструированный тип. В частности, MyObj<int> является закрыто сконструированным типом. Ведь, по существу, такой обобщенный тип, как MyObj<T>, является абстракцией. И только после того, как будет сконструирован конкретный вариант, например MyObj<int>, создается конкретный тип. А конструкция, подобная MyObj<T>, называется в C# открыто сконструированным типом, поскольку в ней указывается параметр типа Т, но не такой конкретный тип, как int.

В C# чаще определяются такие понятия, как открытый и закрытый типы. Открытым типом считается такой параметр типа или любой обобщенный тип, для которого аргумент типа является параметром типа или же включает его в себя. А любой тип, не относящийся к открытому, считается закрытым. Сконструированным типом считается такой обобщенный тип, для которого предоставлены все аргументы типов. Если все эти аргументы относятся к закрытым типам, то такой тип считается закрыто сконструированным. А если один или несколько аргументов типа относятся к открытым типам, то такой тип считается открыто сконструированным.

И еще один момент. В связи с изложенным выше возникает следующий резонный вопрос: если аналогичные функциональные возможности обобщенного класса MyObj можно получить и без обобщений, просто указав объект как тип данных и выполнив надлежащее приведение типов, то какая польза от того, что класс MyObj делается обобщенным? Ответ на этот вопрос заключается в том, что обобщения автоматически обеспечивают типовую безопасность всех операций, затрагивающих класс MyObj. В ходе выполнения этих операций обобщения исключают необходимость обращаться к приведению типов и проверять соответствие типов в коде вручную.

Пройди тесты
Лучший чат для C# программистов