它被问了100次,但他们都有不同的答案。所以我才敢再次提出这个问题。为什么我们不能将所有抽象方法移到接口上?
我知道有模板模式可以使用抽象方法来实现,但是它也可以使用接口来完成,所以为什么要抽象方法。今天我正在阅读有关此内容并试图找到答案。
提前致谢。
它被问了100次,但他们都有不同的答案。所以我才敢再次提出这个问题。为什么我们不能将所有抽象方法移到接口上?
我知道有模板模式可以使用抽象方法来实现,但是它也可以使用接口来完成,所以为什么要抽象方法。今天我正在阅读有关此内容并试图找到答案。
提前致谢。
接口定义了对象的公共契约。在使用模板模式时,我经常使用受保护的(在 Java 中)抽象方法,因为我不希望外部调用者能够调用该方法。
在某些情况下,您可能不需要接口。如果你有类似的东西怎么办
abstract class MyClass {
someConreteMethod() { ... }
abstract someAbstractMethod();
}
也许你只想要MyClass
扩展抽象的实现MyClass
一般来说,我不经常使用公共抽象方法,但使用非公共抽象方法更为常见。
我假设您已经知道这一点,但是接口要求实现者覆盖每个方法。抽象类没有。这很有用的原因是因为您可能希望为扩展该抽象类的所有类提供一个方法实现。
一个简单的例子可能是一个 Person 类
abstract class Person{
public void pumpBlood(){
//do blood pumping stuff
}
public void talk();
public void getDressed(Clothes someClothes);
}
所有人都应该(理论上)以相同的方式抽血,但并非所有人都应该以同样的方式穿衣或说话。抽象类适用于这种可以提供具体方法的情况。
这是模板方法模式的一个例子。用抽象类制作的模板,带有一些 final 方法(你不想改变的逻辑)和抽象方法(被实现覆盖)
public abstract class HtmlTemplate {
/**
* Get html code.
* Its final, so nobody can override.
* @return Html code.
*/
public final String getHtml() {
String html = "<html>"
+ "<head>"
+ getHead() // abstract method
+ "</head>"
+ "<body>"
+ getBody() // abstract method
+ "</body>"
+ "</html>";
return html;
}
/**
* Get head implementation.
* @return head code
*/
protected abstract String getHead();
/**
* Get body implementation.
* @return body code
*/
protected abstract String getBody() ;
}
public class MyHtmlPageImpl extends HtmlTemplate {
@Override
protected String getHead() {
return "<title>My page</title>";
}
@Override
protected String getBody() {
return "Hello world";
}
}