2010-01-19 15 views
13

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

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

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

ответ

14

Для заполнения первых ответов:

Интерфейс - это «договор». Если класс реализует интерфейс, он должен предлагать все службы, перечисленные в интерфейсе.

Абстрактный класс скелет. Он определяет определенный способ, которым его расширенные классы будут работать, позволяя им некоторое свободное пространство (абстрактные методы) быть уникальными.

Чистый абстрактный класс делает то же самое, как интерфейс, но есть проблема уникальной простирающийся так, для меня это не интересует

+1

У чистого абстрактного класса есть проблема с уникальным расширением, но он может определять другие возможности, нежели публичные. – csblo

2

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

5

В Java и C#, можно использовать несколько интерфейсов для вывода из и только один класс наследовать,

+1

Это ответ –

+1

Это не ответ, поскольку один очень важный аспект не упоминается: абстрактные классы * могут * реализовывать элементы. –

+1

@Wim: true, но если вы прочитаете второй абзац исходного вопроса, то ясно, что OP интересуется только теми абстрактными классами, которые не имеют реализованных методов и, таким образом, выглядят почти как интерфейсы. – catwalk

10

Каждый интерфейс неявно аннотация: Каждое объявление метода в теле интерфейса неявно абстрактны и общественности.

У абстрактного класса есть методы, которые могут содержать реализацию. Абстрактные методы могут быть общедоступными, защищенными или доступными по умолчанию (видимый пакет). В отличие от интерфейсов абстрактные классы могут содержать поля, которые не являются статическими и конечными.

Также см:
Interfaces vs Abstract classes и Java tutorial

0

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

2

Есть три отличия:

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

И абстрактный класс * может * реализовывать методы. –

1

Вы можете использовать интерфейс для множественного наследования, но вы не можете использовать абстрактный класс для множественного наследования.

Все методы в интерфейсе являются общедоступными по умолчанию, в абстрактном классе, только те методы, которые вы установили как абстрактные, должны быть объявлены общедоступными.

1

Я просто хочу обратиться одну точку (в основном потому, что другие вопросы были адресованы уже):

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

В теории вы могли бы. Однако в какой-то степени вы потеряете гибкость и ослабление сцепления. Гораздо предпочтительнее использовать код для интерфейсов и передавать их, особенно в сценариях инверсии управления (IoC) и с точки зрения интеграции, поскольку это позволяет гораздо большую расширяемость.

2

Поскольку вопрос о чистых абстрактных классах, то я бы сказал, что ответ будет связан с наследованием и областью. Это то, о чем я много раз задумывался, и это то, что я придумал.

Очевидно, что функции, связанные с множественным наследованием, были получены ранее, поэтому я не буду вдаваться в это. Масштаб - большой, хотя.

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

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

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

НТН

+2

В Java нет слова «запечатанное»; подкласс должен быть помечен как «final». –

3

Это не очень theorotical но объяснений, это программно все правильные

        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 

* Абстрактные классы могут иметь частные методы, но не абстрактные частные методы.

3

Одной из причин выбора чистого абстрактного интерфейса является принуждение подклассов к реализации определенных методов, которые реализуются суперклассом.

Например (в Java),

Допустим, вы хотите, чтобы все простирающиеся классы для реализации ToString(), равна() и хэш-код().

Вы можете создать интерфейс под названием ForceSomeMethods для этого контракта, но эти методы неявно реализуются Object.

Создание ForceSomeMethods чистого абстрактного класса с помощью toString() и т. Д. В качестве абстрактных методов, все подклассы будут вынуждены реализовать эти методы.

+0

Это ДЕЙСТВИТЕЛЬНО интересный ответ, и тот, который я не видел в другом месте. Не весь ответ, а очень ценная деталь. –

Смежные вопросы