Я видел много ответов на stackoverflow, но я не нашел ответа, соответствующего моему. Помимо всех этих различий, имеет ли смысл, если мы говорим, что абстрактный класс абстрагирует реализацию поведения, а интерфейс абстрагирует тип, который реализует поведение.Как абстрактный класс отличается от интерфейса от точки дизайна?
ответ
Основные отличия от точки зрения дизайна является то, что:
- вы можете объявить контракт на конструктор исполнителей классов, путем создания защищенного конструктора в базовом абстрактном классе.
- вы можете обеспечить реализацию методов используемых базовых классами
- вы можете сделать обертку вокруг контракта (например, проверки аргументов методы)
- вы можете обеспечить «призывающую схему», когда вы создаете не абстрактные методы, которые требуют абстрактные методы типа, реализуемые производными классами. Это может быть полезно для реализации абстракции алгоритма в производных классах, тогда как базовый класс реализует всю логику обработки - подготавливает и проверяет данные и позволяет реализовать фактический алгоритм обработки производными классами.
Так что я бы сказал, что вы правы в утверждении, что «абстрактный класс абстрагируется реализацию поведения, а интерфейс абстрагирует тип, который реализует поведение»
Абстрактный класс: обеспечивает требование реализации некоторые методы (вы переопределить методы абстрактного класса)
Интерфейс: определяет только контракт. Указывает, что класс, который реализует интерфейс имеет методы интерфейса (вы реализовать интерфейс)
Например:
путем реализации интерфейса на существующем классе, просто объявить добавление интерфейса методы к договору класса. Класс может уже реализовать все методы интерфейса, и вам не нужно ничего менять в существующем классе.
, изменив базовый тип на абстрактный класс, вам необходимо переопределить все методы, даже если методы типа с такими же именами, как абстрактные методы базового класса, уже существуют в типе.
Абстрактный класс может (и обычно делает) обеспечить некоторую реализацию.
И интерфейс не может обеспечить реализацию.
На самом деле нет, потому что абстрактному классу не нужно реализовывать какое-либо поведение. Вероятно, это должно произойти, потому что в противном случае вы можете аргументировать его полезность, но не не должны.
Как правило, абстрактный класс реализует какое-то поведение, но оставляет нерешенным некоторое специализированное поведение.
Например, вы можете написать класс, который реализует сервер сетевых приложений, но не реализует функцию процесса, вместо этого оставляя это для унаследованного класса для реализации.
class MyServer(Networkserver):
// process() is called whenever a client has sent a request
function process(data):
...
Делая класс абстрактным и, следовательно, не может быть реализован, там не должно быть какой-то правильное поведение «по умолчанию» для функций специализации.
Интерфейс = чистый абстрактный класс (абстрактный класс, без реализации)
Чисто с точки зрения дизайна, и, будучи языком агностиком, интерфейс представляет собой договор между классом и клиентом, пообещав, что он делает, а не как он это делает. Это использование подразумевается в мантре «программа для интерфейса».
Поскольку языки, такие как C++, не имеют интерфейсов, абстрактный класс является единственным способом его представления. Для языков, в которых интерфейс является конструкцией первого класса, в любом случае приемлемо, и в выборе есть компромиссы. Конечно, есть и другие технические различия в реализации языков, но я не думаю, что вы спрашивали об этом.
an interview with Erich Gamma, в котором он обсуждает некоторые отличия.
Чтобы ответить на ваш вопрос, я думаю, что это имеет смысл с теоретической точки зрения. С практической точки зрения, это, вероятно, зависит от того, на каком языке вы программируете :)
Я искал ответ, который поддерживает мой аргумент «Различные иерархии (семейства) объектов могут реализовать один и тот же интерфейс, но они не может иметь такой же абстрактный базовый класс ». Поэтому я верил, что «абстрактный класс абстрагирует реализацию поведения, а интерфейс абстрагирует тип, реализующий поведение» – somaraj
Оба имеют конкретные виды использования в соответствии с классом абстрактного языка, который предназначен для базового класса и не может быть создан. Тогда как, когда и нужно определить только контракт (NO реализации), который каждый класс реализации должен следовать thrie своему, то и должны использовать interfaces.Also -
Может быть базовый класс для наследования
абстрактного класса - да Интерфейс - нет
Может иметь impelementation
абстрактный класс - да Интерфейс -не
- 1. Как абстрактный класс отличается от конкретного класса?
- 2. Общий абстрактный базовый класс от общего интерфейса
- 3. Абстрактный унаследованный класс от модели
- 4. Абстрактный класс, наследующий от RecursiveTask
- 5. Абстрактный класс от PHP-скрипта?
- 6. Цвет интерфейса интерфейса отличается от цвета кода
- 7. Как назвать абстрактный класс от не-родителя
- 8. Как класс отличается от библиотеки классов?
- 9. - это абстрактный класс типа интерфейса?
- 10. C# выход отличается от выхода точки останова
- 11. Почему основная функция отличается от другой функции от точки стека?
- 12. Как memcached отличается от других распределенных кэшей?
- 13. Скрыть класс от его интерфейса
- 14. Невозможно создать класс от интерфейса
- 15. Как отличить конкретный класс от типа интерфейса?
- 16. Класс Python __init__ действительно отличается от конструктора
- 17. Как Gitlab отличается от Github?
- 18. Есть alias :: Класс отличается от alias.Class?
- 19. Как `((...))` отличается от `(...)`?
- 20. Как отличается от +?
- 21. Как $() отличается от перенаправления?
- 22. Почему этот WinForm в исполнении настолько отличается от его дизайна?
- 23. Цвет шрифта отличается от оригинального дизайна (электронная рассылка)
- 24. Какая часть этого CSS-дизайна отличается от IE?
- 25. Вложенный абстрактный класс и возвращающий абстрактный класс
- 26. Как функциональный язык отличается от точки зрения реализации языка
- 27. Когда использовать абстрактный класс без интерфейса?
- 28. Зачем использовать пустой абстрактный класс вместо интерфейса?
- 29. Причины не использовать абстрактный класс вместо интерфейса?
- 30. Как определить, что ориентация устройства отличается от ориентации интерфейса?
Говоря более абстрактным классом, реализация и интерфейс не могут быть реализованы, класс может иметь много интерфейсов и может иметь только один абстрактный базовый класс , я чувствовал, что другая иерархия (семейство) объектов может реализовать один и тот же интерфейс, но у них не может быть одного абстрактного базового класса. вот почему я верю, что «абстрактный класс абстрагирует реализацию поведения, а интерфейс абстрагирует тип, который реализует поведение». – somaraj