我正在阅读这本书 -- Hadoop权威指南
在第二章(第25页)中提到:“新的API更喜欢抽象类而不是接口,因为这些更容易进化。例如,您可以向抽象类添加一个方法(带有默认实现),而不会破坏该类的旧实现。”这是什么意思(特别是“破坏该类的旧实现”是什么意思)?如果有人能够从这个角度给我展示一个样例,那就感激不尽了。为什么从这个角度看抽象类比接口更好呢?
谢谢, 乔治
我正在阅读这本书 -- Hadoop权威指南
在第二章(第25页)中提到:“新的API更喜欢抽象类而不是接口,因为这些更容易进化。例如,您可以向抽象类添加一个方法(带有默认实现),而不会破坏该类的旧实现。”这是什么意思(特别是“破坏该类的旧实现”是什么意思)?如果有人能够从这个角度给我展示一个样例,那就感激不尽了。为什么从这个角度看抽象类比接口更好呢?
谢谢, 乔治
给定接口 A
interface A {
public void foo();
}
并且有一个类B:
class B implements A {
}
它必须为接口中定义的方法提供一个实现:
class B implements A {
@Override
public void foo() {
System.out.println("foo");
}
}
否则它将会是一个编译时错误。现在来看一个带有默认方法实现的抽象类:abstract class C {
public void bar() {
System.out.println("bar");
}
}
继承自这个抽象类的类可以像这样:
class D extends C { }
代码没有报错。但是如果愿意,它也可以覆盖默认的方法实现。
作者的意思是:如果你的 API 还不稳定,并且需要适应接口(是的,在 OOP 中,抽象类也是接口),那么抽象类允许你添加新功能而不会破坏已经存在的类。然而,这仅对非抽象方法成立。如果你添加抽象方法,则仍然需要在每个派生类中实现它们。但是,如果你有一个仍在发展中并且已经有很多构建在其上的东西的 API,它可以使你的生活更轻松。
Goo
定义为抽象类),那么你就必须遍历每个派生类并添加适当的方法实现。 - Joey