Ответ 1
public interface IGenericFace<T> where T : SomeBaseClass
Возможно ли, чтобы общий тип интерфейса был основан на определенном родительском классе?
Например:
public interface IGenericFace<T : BaseClass>
{
}
Очевидно, что приведенный выше код не работает, но если это так, то я пытаюсь сказать компилятору, что T
должен быть подклассом BaseClass
. Это можно сделать, есть ли планы на это и т.д.?
Я думаю, что это было бы полезно с точки зрения конкретного проекта, убедившись, что общий интерфейс/класс не используется с непреднамеренными типами (типами) во время компиляции. Или также для сортировки самодокумента: покажите, какой тип предназначен.
public interface IGenericFace<T> where T : SomeBaseClass
То, о чем вы говорите, называется "Общие ограничения". Существует множество ограничений, которые могут быть применены к родовому типу.
Вот некоторые основные примеры:
where T: struct
- Аргумент типа должен быть типом значения. Можно указать любой тип значения, кроме Nullable
-. См. Использование Nullable Types (Руководство по программированию на С#) для получения дополнительной информации.
where T : class
- Аргумент типа должен быть ссылочным типом; это относится также к любому типу класса, интерфейса, делегата или массива.
where T : new()
- Аргумент типа должен иметь открытый конструктор без параметров. При использовании вместе с другими ограничениями ограничение new()
должно быть указано последним.
where T : <base class name>
- Аргумент типа должен быть или выводиться из указанного базового класса.
where T : <interface name>
- Аргумент типа должен быть или реализовать указанный интерфейс. Можно указать несколько ограничений интерфейса. Сдерживающий интерфейс также может быть общим.
where T : U
- Аргумент типа, предоставленный для T
, должен быть или получен из аргумента, предоставленного для U
. Это называется ограничением голого типа.
Они также могут быть связаны между собой следующим образом:
С#
public class TestClass<T> where T : MyBaseClass, INotifyPropertyChanged, new() { }
public interface IGenericFace<T> where T : SomeBaseClass
В. Б.
Public Class TestClass(Of T As {MyBaseClass, INotifyPropertyChanged, New})
Public Interface IGenericInterface(Of T As SomeBaseClass)
да.
public interface IGenericFace<T>
where T : BaseClass
{
}
Дополнительная информация о общих интерфейсах: http://msdn.microsoft.com/en-us/library/kwtft8ak(VS.80).aspx