问题 骨架实现与普通抽象类有何不同?


有效的Java,Joshua Bloch喜欢接口而不是抽象类。但是,他指出每个接口都应该有一个骨架实现。

我觉得骨架实现几乎与抽象类相同。这两个概念有何不同?


8108
2018-06-24 21:52


起源

对于 一切 接口?你能给出这个陈述的页面参考吗? - Puce


答案:


重新阅读上述部分后编辑 有效的Java

根据本书的这一部分 一个骨架实现  抽象类。他推荐这种方法,因为在一个骨架实现到位后,实现接口并有选择地覆盖方法变得微不足道,即使是匿名类(正如他在书中所做的那样)。


以前的答案,略有编辑以保持连续性

从理论上讲,骨架实现可以是一个完整的实现,因此具体。然后它可以用于 组成,因为它可以实例化。而抽象类 要求 遗产。


6
2018-06-24 21:56





他的意思是你应该提供一个接口,以及一个实现这个接口部分的抽象类:

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

private abstract class AbstractFoo implements Foo {
    ...
}

AbstractFoo 如果可以提供基本的,完整的实现,那么class甚至可能不是抽象的。但是如果你需要一个Foo类,但不能扩展AbstractFoo,它仍然可以使用一个接口。抽象类不提供此功能,因为您只能扩展一个类。

顺便说一句,这是在集合框架(Josh Bloch创建)中所做的: Set 接口由。实现 AbstractSetList 接口由。实现 AbstractList


4
2018-06-24 22:00





接口/抽象类是API的一部分。

骨架实现是一个有效的具体 class,但实施有限/天真/差; (一个非常人为的)例子,a的骨架实现 Sorter 接口可能会实现 泡泡排序  - 您不希望在生产应用程序中使用它,但它说明了如何实现该接口


2
2018-06-24 22:00





我觉得骨架实现几乎与a相同   抽象类。这两个概念有何不同?

对我来说,他们有所不同 意图。当我看到一些方法需要传入接口时,我知道实现取决于我。如果退回课程,我不再确定。简直就是一个 含义 使用一个类不存在的接口。

此外,当我们要传入的类已经是子类时,接受参数类的方法会引发冲突; Java不支持多重继承。接口没有这个问题。


2
2018-06-24 23:50





“骨架实现”是一个具体的类:您可以编译并测试它。

抽象类不是,你不能;)


0
2018-06-24 21:55



-1您可以编译每个正确形成的类。骨架实现是一个抽象类。 - Maciej Ziarko
Dude,“骨架实现”不一定是抽象类。 - paulsm4
我低估你的答案主要是因为“你可以编译”。这是一本引用书中的抽象类。我正是这个意思。 - Maciej Ziarko