Как реализация скелета отличается от обычного абстрактного класса?
В Эффективной Java Джошуа Блох выступает за интерфейсы над абстрактными классами. Тем не менее, он отмечает, что реализация скелета должна сопровождаться каждым интерфейсом.
Я чувствую, что скелетная реализация почти такая же, как абстрактный класс. Как отличаются эти два понятия?
Ответы
Ответ 1
Отредактировано после повторного чтения вышеупомянутого раздела в "Эффективной Java"
В соответствии с этим разделом книги скелетная реализация является абстрактным классом. Он рекомендует этот подход, потому что после реализации скелетной реализации становится тривиальным реализовывать интерфейс и выборочно переопределять методы даже с анонимным классом (как он это делает в своей книге).
Предыдущий ответ, слегка отредактированный для непрерывности
Скелетная реализация теоретически может быть полной реализацией и, следовательно, конкретной. Затем его можно использовать с composition, поскольку он может быть создан. В то время как абстрактные классы требуют наследования.
Ответ 2
Он имеет в виду, что вы должны предоставить интерфейс и абстрактный класс, реализующий части этого интерфейса:
public interface Foo {
void bar();
void baz();
}
private abstract class AbstractFoo implements Foo {
...
}
Класс AbstractFoo
может быть даже не абстрактным, если можно обеспечить базовую, полную реализацию. Но если вам нужен класс, который является Foo, но не может расширить AbstractFoo, он по-прежнему возможен с интерфейсом. Абстрактный класс не предоставляет эту возможность, поскольку вы можете расширить только один класс.
Кстати, это то, что сделано в рамках коллекций (созданный Джошем Блохом): интерфейс Set
реализован AbstractSet
, интерфейс List
реализован AbstractList
и т.д.
Ответ 3
Интерфейс/абстрактный класс является частью API.
Скелетная реализация является действительным конкретным class
, но ограничена/наивна/плохая реализация; для (очень надуманного) примера, скелетная реализация интерфейса Sorter
может реализовать тип пузыря - вы не захотите использовать его в производственное приложение, но оно иллюстрирует, как можно реализовать интерфейс
Ответ 4
Я чувствую, что скелетная реализация почти такая же, как у абстрактный класс. Как отличаются эти два понятия?
Для меня они отличаются намерениями. Когда я вижу, какой-то метод предполагает, что интерфейс будет передан, я знаю, что реализация зависит от меня. Если класс возвращается, я не уверен. Просто смысл использования интерфейса, который не существует для класса.
Кроме того, методы, которые принимают классы для аргументов, конфликтуют, когда класс, который мы хотели бы передать, уже является подклассом; Java не поддерживает множественное наследование. Интерфейсы не имеют этой проблемы.
Ответ 5
"Скелетная реализация" - это конкретный класс: вы можете скомпилировать и протестировать его.
Абстрактный класс не является, и вы не можете;)