在 有效的Java,Joshua Bloch喜欢接口而不是抽象类。但是,他指出每个接口都应该有一个骨架实现。
我觉得骨架实现几乎与抽象类相同。这两个概念有何不同?
在 有效的Java,Joshua Bloch喜欢接口而不是抽象类。但是,他指出每个接口都应该有一个骨架实现。
我觉得骨架实现几乎与抽象类相同。这两个概念有何不同?
重新阅读上述部分后编辑 有效的Java
根据本书的这一部分 一个骨架实现 是 抽象类。他推荐这种方法,因为在一个骨架实现到位后,实现接口并有选择地覆盖方法变得微不足道,即使是匿名类(正如他在书中所做的那样)。
以前的答案,略有编辑以保持连续性
从理论上讲,骨架实现可以是一个完整的实现,因此具体。然后它可以用于 组成,因为它可以实例化。而抽象类 要求 遗产。
他的意思是你应该提供一个接口,以及一个实现这个接口部分的抽象类:
public interface Foo {
void bar();
void baz();
}
private abstract class AbstractFoo implements Foo {
...
}
该 AbstractFoo
如果可以提供基本的,完整的实现,那么class甚至可能不是抽象的。但是如果你需要一个Foo类,但不能扩展AbstractFoo,它仍然可以使用一个接口。抽象类不提供此功能,因为您只能扩展一个类。
顺便说一句,这是在集合框架(Josh Bloch创建)中所做的: Set
接口由。实现 AbstractSet
, List
接口由。实现 AbstractList
等
接口/抽象类是API的一部分。
骨架实现是一个有效的具体 class
,但实施有限/天真/差; (一个非常人为的)例子,a的骨架实现 Sorter
接口可能会实现 泡泡排序 - 您不希望在生产应用程序中使用它,但它说明了如何实现该接口
我觉得骨架实现几乎与a相同 抽象类。这两个概念有何不同?
对我来说,他们有所不同 意图。当我看到一些方法需要传入接口时,我知道实现取决于我。如果退回课程,我不再确定。简直就是一个 含义 使用一个类不存在的接口。
此外,当我们要传入的类已经是子类时,接受参数类的方法会引发冲突; Java不支持多重继承。接口没有这个问题。
“骨架实现”是一个具体的类:您可以编译并测试它。
抽象类不是,你不能;)