Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство_по_C#.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
10.01 Mб
Скачать

11.5Ограниченные интерфейсы и конструкторы Применение ограничения на интерфейс

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

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

where T : имя_интерфейса

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

Применение ограничения new() на конструктор

Ограничение new() на конструктор позволяет получать экземпляр объекта обобщенного типа. Как правило, создать экземпляр параметра обобщенного типа не удается. Но это положение изменяет ограничение new(), поскольку оно требует, чтобы аргумент типа предоставил конструктор без параметров. Им может быть конструктор, вызываемый по умолчанию и предоставляемый автоматически, если явно определяемый конструктор отсутствует или же конструктор без параметров явно объявлен пользователем. Накладывая ограничение new(), можно вызывать конструктор без параметров для создания объекта.

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

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;

return;

}

public void Print()

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

}

class Program

{

static void Main()

{

Info<AllInfoUser> database1 = new Info<AllInfoUser>();

database1.Add(new AllInfoUser("Alex", "Erohin", 26));

database1.Add(new AllInfoUser("Alexey", "Volkov", 28));

database1.Add(new AllInfoUser("Dmitryi", "Medvedev", 50));

database1.Print();

Console.ReadKey();

}

}

}

Вывод программы:

Информация о пользователе:

Erohin Alex 26

Информация о пользователе:

Volkov Alexey 28

Информация о пользователе:

Medvedev Dmitryi 50

Что касается применения ограничения new(), то следует обратить внимание на три важных момента:

  1. Его можно использовать вместе с другими ограничениями, но последним по порядку.

  2. Оно позволяет конструировать объект, используя только конструктор без параметров, даже если доступны другие конструкторы. Иными словами, передавать аргументы конструктору параметра типа не разрешается.

  3. Его нельзя использовать одновременно с ограничением типа значения.