Чистый абстрактный класс и интерфейс
Может ли кто-нибудь сказать мне, какая именно разница между полностью абстрактным классом и интерфейсом?
Абстрактный класс также может использовать все его методы как абстрактные. Интерфейс имеет все методы как абстрактные. В чем основное отличие между ними в этом сценарии?
Если существует разница между чистым абстрактным классом и интерфейсом? Какая польза от интерфейса? Где используется интерфейс, мы можем использовать чистый абстрактный класс?
Ответы
Ответ 1
Чтобы выполнить первые ответы:
Интерфейс - это "контракт". Если класс реализует интерфейс, он должен предлагать все сервисы, перечисленные в интерфейсе.
Абстрактный класс - это скелет. Он определяет определенный способ, которым его расширенные классы будут работать, позволяя им некоторое свободное пространство (абстрактные методы) быть уникальными.
Чистый абстрактный класс делает то же самое, что и интерфейс, но имеет проблему уникального распространения, поэтому для меня это не интересует
Ответ 2
Каждый интерфейс является неявным абстрактным: каждое объявление метода в теле интерфейса является неявным абстрактным и общедоступным.
Абстрактный класс имеет методы, которые могут содержать реализацию. Абстрактные методы могут быть общедоступными, защищенными или доступными по умолчанию (видимый пакет). В отличие от интерфейсов абстрактные классы могут содержать поля, которые не являются статичными и окончательными.
Также смотрите:
Интерфейсы против абстрактных классов и
Учебник по Java
Ответ 3
В Java и С# можно использовать несколько интерфейсов для вывода и только один класс для наследования,
Ответ 4
Это не очень теоретическое объяснение, но, программно все это правильно
Interface Abstract Class
Extend Class No Yes
Extend Abstract Class No Yes
Implement Interface Yes(Extend Interface) Yes
Variables Public Static Final Public/Protected/Private/static/final/transient/volatile
Contain Non-Public Method No Public/Protected/*Private
Contain Abstract Method Yes Yes
Contain No-Body, Non-Abstract Method Yes No
Contain Defined Method No Yes
Contain Main Method No Yes
* Абстрактные классы могут иметь частные методы, но не абстрактные частные методы.
Ответ 5
Одна из причин выбора чистого абстрактного интерфейса - заставить подклассы реализовать определенные методы, которые реализуются суперклассом.
Например (в Java),
Предположим, что все расширяющие классы реализуют toString(), equals() и hashCode().
Вы можете создать интерфейс под названием ForceSomeMethods для этого контракта, но эти методы неявно реализованы Object.
Создание ForceSomeMethods чистого абстрактного класса с toString() и т.д. в качестве абстрактных методов, все подклассы будут вынуждены реализовать эти методы.
Ответ 6
Абстрактный класс может обеспечить реализацию, т.е. (общедоступные, защищенные, частные) методы. Интерфейс может просто объявлять публичные подписи методов. Эти методы должны быть реализованы (в форме тел метода) классами, реализующими интерфейс.
Ответ 7
Существуют три отличия:
- Интерфейсы могут объявлять только общедоступные методы (т.е. защищенные или скрытые по частям методы) и не могут объявлять какие-либо поля
- Подклассы могут распространяться не более чем на один абстрактный класс, но могут реализовывать любое количество интерфейсов
- Абстрактный класс также может иметь реализации для некоторых или всех методов
Ответ 8
Поскольку вопрос о чистых абстрактных классах, я бы сказал, что ответ будет связан с наследованием и областью. Это то, что я часто задавал себе вопрос, и это то, что я придумал.
Очевидно, что функции, связанные с множественным наследованием, были ответены ранее, поэтому я не буду вдаваться в это. Масштаб - большой, хотя.
В интерфейсе вы не можете определить модификаторы доступа к члену, поскольку они неявно общедоступны,... вы определяете интерфейс public для его возможной реализации. Там существует важное различие, поскольку может определять защищенный абстрактный элемент в чистом абстрактном классе.
Наследование от такого определения класса заставит наследника реализовывать абстрактный элемент, но в частном порядке его использовать для потребителей этого класса (хотя он должен быть определен как protected
, поэтому, если класс не был помечен как sealed
далее у наследников будет доступ).
В сущности, вы можете определить частный интерфейс, используя чистые абстрактные классы. Является ли это хорошей идеей совсем другой вопрос, но одно хорошее применение, которое я видел, для этого - это принудительное использование шаблонов проектирования и стандартизация проектов классов.
НТН
Ответ 9
Вы можете использовать интерфейс для множественного наследования, но вы не можете использовать абстрактный класс для множественного наследования.
Все методы в интерфейсе являются общедоступными по умолчанию, в абстрактном классе, только те методы, которые вы задали как абстрактные, должны быть объявлены публичными.
Ответ 10
Я собираюсь обратиться к одному пункту (главным образом потому, что другие вопросы уже рассмотрены):
"Если интерфейс используется, мы можем использовать чистый абстрактный класс?"
В теории вы могли бы. Однако в какой-то степени вы потеряете гибкость и ослабление сцепления. Это гораздо предпочтительнее кода для интерфейсов и передает их, особенно в сценариях инверсии управления (IoC) и с точки зрения интеграции, поскольку это позволяет гораздо большую расширяемость.
Ответ 11
Класс может реализовывать несколько интерфейсов, но распространяется только от одного класса (абстрактного или другого). Если вам нужно указать интерфейс, то вы должны использовать интерфейс, чтобы классы могли реализовать несколько интерфейсов.