Чистый абстрактный класс и интерфейс

Может ли кто-нибудь сказать мне, какая именно разница между полностью абстрактным классом и интерфейсом?

Абстрактный класс также может использовать все его методы как абстрактные. Интерфейс имеет все методы как абстрактные. В чем основное отличие между ними в этом сценарии?

Если существует разница между чистым абстрактным классом и интерфейсом? Какая польза от интерфейса? Где используется интерфейс, мы можем использовать чистый абстрактный класс?

Ответы

Ответ 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

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