Ограничение базового типа
После where T : указывают имя класса или
интерфейса. Тогда внутри обобщённого кода доступны
члены этой базы: методы, свойства и поля. Для
нескольких интерфейсов их перечисляют через
запятую. Так связывают обобщения с
наследованием
и interface.
Синтаксис
class Store<T> where T : BaseType
{
}
void Print<T>(T item) where T : IText
{
}
Пример
Давайте вызовем метод базового класса через T:
using System;
class BaseCode
{
public virtual string GetCode()
{
return "12345";
}
}
class DerivedCode : BaseCode
{
public override string GetCode()
{
return "abcde";
}
}
class Reader<T> where T : BaseCode
{
public string Read(T item)
{
return item.GetCode();
}
}
class Program
{
static void Main()
{
var reader = new Reader<DerivedCode>();
Console.WriteLine(reader.Read(new DerivedCode()));
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте ограничим T интерфейсом и прочитаем
текст:
using System;
interface IText
{
string GetText();
}
class Line : IText
{
public string GetText()
{
return "abcde";
}
}
class Echo<T> where T : IText
{
public string Run(T item)
{
return item.GetText();
}
}
class Program
{
static void Main()
{
var echo = new Echo<Line>();
Console.WriteLine(echo.Run(new Line()));
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте передадим в метод разные классы с общей базой:
using System;
class Root
{
public int Size = 5;
}
class Branch : Root
{
}
class SizeOf<T> where T : Root
{
public int Read(T item)
{
return item.Size;
}
}
class Program
{
static void Main()
{
var tool = new SizeOf<Branch>();
Console.WriteLine(tool.Read(new Branch()));
}
}
Результат выполнения кода:
5
Смотрите также
-
несколько ограничений,
где база сочетается с интерфейсами -
ограничение class,
которое задаёт ссылочный тип без конкретной базы -
наследование,
которое связывает производный и базовый класс -
ключевое слово
interface,
которое задаёт контракт дляT