2012-06-24 3 views
11

В Эффективная Java, Джошуа Блох выступает за интерфейсы над абстрактными классами. Тем не менее, он отмечает, что скелетная реализация должна приходить с каждым интерфейсом.Как скелетная реализация отличается от обычного абстрактного класса?

Я чувствую, что реализация скелета почти такая же, как абстрактный класс. Как эти два понятия отличаются?

+0

Для интерфейса _every_? Не могли бы вы указать ссылку на эту ссылку? – Puce

ответ

6

редакцией после перечитывания вышеупомянутого раздела в Effective Java

According to this section of the book скелетной реализация является абстрактным класс. Он рекомендует этот подход, потому что после реализации скелетной реализации становится тривиальным реализовывать интерфейс и выборочно переопределять методы даже с анонимным классом (как он это делает в своей книге).


Предыдущий ответ, слегка отредактированный для непрерывности

скелетной реализации теоретически может быть полной реализации и, следовательно, бетон. Затем он может использоваться с composition, так как он может быть создан. В то время как абстрактные классы требуют наследования.

0

«Скелетная реализация» - это конкретный класс: вы можете скомпилировать и протестировать его.

Абстрактный класс не является, и вы не можете;)

+1

-1 Вы можете скомпилировать каждый правильно сформированный класс. Скелетная реализация - абстрактный класс. –

+0

Чувак, «скелетная реализация» НЕ обязательно является абстрактным классом. – paulsm4

+0

Я проигнорировал ваш ответ в основном из-за «вы можете скомпилировать». Это абстрактный класс в справочной книге. Это то, что я имел в виду. –

2

Интерфейс/абстрактный класс является частью API.

Скелетная реализация действительна бетон class, но ограниченная/наивная/плохая реализация; для (очень надуманного) примера реализация скелета интерфейса Sorter может реализовать bubble sort - вы не хотели бы использовать его в производственном приложении, но он иллюстрирует, как можно реализовать интерфейс.

4

Что он означает, так это то, что вы должны обеспечить интерфейс и абстрактный класс, реализующие части этого интерфейса:

public interface Foo { 
    void bar(); 
    void baz(); 
} 

private abstract class AbstractFoo implements Foo { 
    ... 
} 

AbstractFoo класса может даже не быть абстрактным, если это возможно, чтобы обеспечить основную, полную реализацию. Но если вам нужен класс, который является Foo, но не может расширять AbstractFoo, он по-прежнему возможен с интерфейсом. Абстрактный класс не предоставляет эту возможность, поскольку вы можете расширить только один класс.

Кстати, это то, что делается в рамках коллекций (который создал Josh Bloch): интерфейс Set реализуется AbstractSet, интерфейс List осуществляется AbstractList и т.д.

2

Я чувствую, что скелетная реализация почти такая же, как абстрактный класс класса . Как эти два понятия отличаются?

Для меня они отличаются в умыслами.Когда я вижу, какой-то метод предполагает, что интерфейс будет передан, я знаю, что реализация зависит от меня. Если класс возвращается, я не уверен. Существует просто , что означает для использования интерфейса, который не существует для класса.

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

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