Сравнение: abstract class vs interface

Представляю вольный и дополненный перевод таблицы из статьи на CodeProject.

Таблица различий между абстрактным классом и интерфейсом в C#

Аспект abstract class interface
Назначение Как любой базовый класс, представляет ядро поведения для всех наследников. Если в абстрактном классе не реализован ни один метод, имеет смысл превратить его в интерфейс. Контракт, ничего более. Интерфейсы часто используются (и во основном предназначены для этого) как примеси без реализации при проектировании иерархии классов.
Реализация по умолчанию Может быть частично или полностью реализован, предоставлять базовую функциональность. Не может содержать какой-либо код.
Модификаторы доступа членов Члены могут иметь все допустимые модификаторы доступа. Только public.
Наследование Наследование от абстрактного класса реализует отношение “является”. Наследование от интерфейса определяет отношение “реализует”.
Множественное наследование Класс может наследовать только один класс. Класс может наследовать несколько интерфейсов. При этом он может и не реализовывать методы интерфейса, т. е. быть абстрактным. Сам интерфейс тоже может наследовать несколько интерфейсов.
Скорость Быстро. Требуется больше времения для поиска реализованного метода в соответствующем классе.
Расширение При добавлении нового метода в абстрактный класс, мы можешь реализовать его, тем самым не нарушив работу наследующих классов. Если тело метода оставить нереализованным, потребуется его реализация в классах-наследниках с последующей перекомпиляцией. При добавлении нового метода в интерфейс мы должны определить его во всех классах, реализующих интерфейс, с перекомпиляцией.
Члены Может содержать все допустимые члены. Не может содержать константы, поля, операторы, конструкторы экземпляров, деструкторы или типы. Допускаются: методы, свойства, события, индексаторы (свойства с параметрами).
Статические члены Может содержать статические поля и методы. Не может содержать статические поля и методы.

Источники

  1. http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface
  2. http://msdn.microsoft.com/ru-ru/library/ms173156.aspx
  3. Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. Приемы ООП. Паттерны проектирования.
  4. Дж. Рихтер. CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C#. — С. 322.
  5. Дж. Либерти. Программирование на C#.