Спасибо за ответ Джону Лимджапу , но я хочу добавить некоторое объяснение концепции интерфейса и абстрактных базовых классов
Типы интерфейсов и абстрактные базовые классы
Адаптировано из Pro C # 5.0 и .NET 4.5 Framework book.
Тип интерфейса может показаться очень похожим на абстрактный базовый класс. Отзыв
что когда класс помечен как абстрактный, он может определить любое количество абстрактных членов для
полиморфный интерфейс для всех производных типов. Тем не менее, даже когда класс определяет набор абстрактных
члены, также можно свободно определять любое количество конструкторов, полевых данных, неабстрактных членов (с
реализация) и так далее. Интерфейсы, с другой стороны, содержат только абстрактные определения членов.
Полиморфный интерфейс, установленный абстрактным родительским классом, страдает одним существенным ограничением
в том, что только производные типы поддерживают члены, определенные абстрактным родителем. Однако в большем
В программных системах очень распространено создание нескольких иерархий классов, у которых нет общего родителя.
за пределы System.Object. Учитывая, что абстрактные члены в абстрактном базовом классе применяются только к производным
типы, у нас нет способа настроить типы в разных иерархиях для поддержки одного и того же полиморфного
интерфейс. В качестве примера предположим, что вы определили следующий абстрактный класс:
public abstract class CloneableType
{
// Only derived types can support this
// "polymorphic interface." Classes in other
// hierarchies have no access to this abstract
// member.
public abstract object Clone();
}
Учитывая это определение, только члены, расширяющие CloneableType, могут поддерживать Clone ().
метод. Если вы создадите новый набор классов, которые не расширяют этот базовый класс, вы не сможете получить этот
полиморфный интерфейс. Также вы можете вспомнить, что C # не поддерживает множественное наследование классов.
Поэтому, если вы хотите создать MiniVan, который является автомобилем и является CloneableType, вы не можете сделать это:
// Nope! Multiple inheritance is not possible in C#
// for classes.
public class MiniVan : Car, CloneableType
{
}
Как вы уже догадались, на помощь приходят типы интерфейсов. После того, как интерфейс был определен, он может
быть реализованным любым классом или структурой, в любой иерархии, в любом пространстве имен или любой сборке
(написано на любом языке программирования .NET). Как видите, интерфейсы очень полиморфны.
Рассмотрим стандартный интерфейс .NET с именем ICloneable, определенный в пространстве имен System. это
Интерфейс определяет один метод с именем Clone ():
public interface ICloneable
{
object Clone();
}