Ограниченные классы

20

Ограничение на базовый класс позволяет указывать базовый класс, который должен наследоваться аргументом типа. Ограничение на базовый класс служит двум главным целям:

Ниже приведена общая форма наложения ограничения на базовый класс, в которой используется оператор where:

where T : имя_базового_класса

где T обозначает имя параметра типа, а имя__базового_класса — конкретное имя ограничиваемого базового класса. Одновременно в этой форме ограничения может быть указан только один базовый класс.

Давайте рассмотрим пример:

using System;

namespace ConsoleApplication1
{
    class UserInfo
    {
        public UserInfo(string Name, int Age)
        {
            this.Name = Name;
            this.Age = Age;
        }

        public string Name { get; set; }
        public int Age { get; set; }
    }

    // Создадим класс, унаследованный от UserInfo
    class AllInfoUser : UserInfo
    {
        public AllInfoUser(string Family, string Name, int Age)
            : base(Name, Age)
        {
            this.Family = Family;
        }

        public string Family { get; set; }

        public override string ToString()
        {
            string s = String.Format("Информация о пользователе: \n{0} {1} {2}\n",this.Name,Family,this.Age);
            return s;
        }
    }

    // Обобщенный класс использующий ограничение на базовый класс
    class Info<T> where T : UserInfo
    {
        T[] UserList;
        int i;

        public Info()
        {
            UserList = new T[3];
            i = 0;
        }

        public void Add(T obj)
        {
            if (i == 3) return;
            UserList[i] = obj;
            i++;
            return;
        }

        public void ReWrite()
        {
            foreach (T t in UserList)
                Console.WriteLine(t.ToString());
        }
    }

    class Program
    {
        static void Main()
        {
            Info<AllInfoUser> database1 = new Info<AllInfoUser>();
            database1.Add(new AllInfoUser(Name: "Alex", Family: "Erohin", Age: 26));
            database1.Add(new AllInfoUser(Name: "Alexey", Family: "Volkov", Age: 28));
            database1.Add(new AllInfoUser(Name: "Dmitryi", Family: "Medvedev", Age: 50));

            database1.ReWrite();

            Console.ReadLine();
        }
    }
}
Использование ограниченных классов
CodeChick.io - Задачи по программированию с автоматической проверкой
Пройди тесты
Лучший чат для C# программистов