Разница между абстрактным классом и интерфейсом

Абстрактный класс против интерфейса

Абстрактный класс (или тип) - это тип в именительной системе типов, объявленный программой. Хотя название подразумевает такое, абстрактный класс может включать или не включать абстрактные методы или свойства. Класс различия относится к различным языковым конструкциям, которые могут использоваться для реализации абстрактных типов. Абстрактные классы могут быть охарактеризованы проблемой проектирования, которая соответствует лучшим объектно-ориентированному программированию, и их незавершенной природой.

Интерфейс - это абстрактный тип, который классы должны реализовывать для указания интерфейса (в общем случае). Интерфейсы могут содержать только сигнатуры методов и объявления констант (как статические, так и конечные), но не определения методов. Интерфейсы имитируют множественное наследование и используются для кодирования сходств, общих для различных типов классов.

Абстрактные типы могут быть созданы, обозначены или смоделированы несколькими различными способами. Программист может обозначать абстрактные типы, явно используя ключевое слово abstract, включая один или несколько методов в определение класса, наследуя от другого абстрактного типа, не перекрывая отсутствующие функции, необходимые для завершения определения класса, или отправляя определенный метод объектно-ориентированному язык программирования, известный как этот, который не реализует метод напрямую.

Интерфейсы могут быть определены с использованием абстрактных методов. Классы также могут быть реализованы в интерфейсах. Если класс действительно реализует интерфейс и не реализует все его методы, необходимо использовать абстрактное значение, в противном случае этот указатель не требуется (поскольку все интерфейсы по своей сути являются абстрактными). Классы также могут реализовывать несколько интерфейсов.

В то время как интерфейсы используются для определения общих интерфейсов, абстрактные типы могут использоваться для определения и применения протокола (который представляет собой набор операций, которые должны поддерживать все объекты, реализующие требуемый протокол). Абстрактные типы не встречаются в языках без подтипов. Как таковые подтипы вынуждены реализовывать все необходимые функциональные возможности, обеспечивая правильность выполнения программы. Существует несколько способов создания абстрактных типов: полные абстрактные базовые классы - это классы, которые либо явно объявлены абстрактными, либо содержат абстрактные (не реализованные) методы; Обычные объектные системы Lisp включают в себя миксины, основанные на системе Flavors; Ява, конечно; и черты, которые действуют как продолжение Smalltalk.

Резюме:
1. Абстрактные классы (или типы) объявляют программы; интерфейсы являются абстрактными типами, которые должны реализовывать все классы, чтобы определить их интерфейс.
2. Абстрактные типы могут быть обозначены, используя ключевое слово явно; интерфейсы изначально абстрактны, поэтому их вообще не нужно обозначать ключевым словом (если только определенный класс не реализует интерфейс, но не реализует все его методы).