我正在读这本书 - Hadoop: The Definitive Guide
在第2章(第25页)中,提到“新API支持接口上的抽象类,因为它们更容易发展。例如,您可以向抽象类添加方法(具有默认实现)打破了类的旧实现“。它意味着什么(特别是“破坏类的旧实现”的意思)?感谢是否有人可以向我展示一个示例为什么从这个角度来看抽象类比界面更好?
提前谢谢, 乔治答案 0 :(得分:10)
对于接口,接口中定义的所有方法必须由实现它的类实现。
给定接口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仍在不断发展并且已经有很多东西可以建立,那么它可以让你的生活更轻松。
答案 1 :(得分:6)
如果将具有默认实现的方法添加到抽象类,则不需要在任何派生类中更改任何内容。
或者,如果向接口添加方法,则实现该接口的任何类都需要实现该方法 - 否则它们将无法编译。
答案 2 :(得分:1)
请参阅Eclipse Wiki中的以下指南
不断发展的基于Java的API
示例4 - 添加API方法
可以向类或接口添加API方法是否与现有客户端兼容?
如果将方法添加到客户端可能实现的接口,那么它肯定是一个重大改变。
如果将方法添加到不允许客户端子类化(实现)的类(接口)中,那么这不是一个重大改变。
但是,如果将方法添加到客户端可以子类化的类中,则通常应将更改视为一个重大更改。这个苛刻结论的原因是因为Client的子类可能已经有了自己的方法实现。将API方法添加到超类会削弱客户端的代码,因为如果客户端的现有方法符合新添加的方法的API协定,那将是绝对巧合。在实践中,如果这种名称重合的可能性足够低,这种变化通常被视为不破坏。