Представляю вольный и дополненный перевод таблицы из статьи на CodeProject.
Таблица различий между абстрактным классом и интерфейсом в C#
Аспект | abstract class | interface |
Назначение | Как любой базовый класс, представляет ядро поведения для всех наследников. Если в абстрактном классе не реализован ни один метод, имеет смысл превратить его в интерфейс. | Контракт, ничего более. Интерфейсы часто используются (и во основном предназначены для этого) как примеси без реализации при проектировании иерархии классов. |
Реализация по умолчанию | Может быть частично или полностью реализован, предоставлять базовую функциональность. | Не может содержать какой-либо код. |
Модификаторы доступа членов | Члены могут иметь все допустимые модификаторы доступа. | Только public. |
Наследование | Наследование от абстрактного класса реализует отношение “является”. | Наследование от интерфейса определяет отношение “реализует”. |
Множественное наследование | Класс может наследовать только один класс. | Класс может наследовать несколько интерфейсов. При этом он может и не реализовывать методы интерфейса, т. е. быть абстрактным. Сам интерфейс тоже может наследовать несколько интерфейсов. |
Скорость | Быстро. | Требуется больше времения для поиска реализованного метода в соответствующем классе. |
Расширение | При добавлении нового метода в абстрактный класс, мы можешь реализовать его, тем самым не нарушив работу наследующих классов. Если тело метода оставить нереализованным, потребуется его реализация в классах-наследниках с последующей перекомпиляцией. | При добавлении нового метода в интерфейс мы должны определить его во всех классах, реализующих интерфейс, с перекомпиляцией. |
Члены | Может содержать все допустимые члены. | Не может содержать константы, поля, операторы, конструкторы экземпляров, деструкторы или типы. Допускаются: методы, свойства, события, индексаторы (свойства с параметрами). |
Статические члены | Может содержать статические поля и методы. | Не может содержать статические поля и методы. |
Источники
- http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface
- http://msdn.microsoft.com/ru-ru/library/ms173156.aspx
- Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. Приемы ООП. Паттерны проектирования.
- Дж. Рихтер. CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C#. — С. 322.
- Дж. Либерти. Программирование на C#.