已被问过100次,但他们都有不同的答案。所以我敢再提这个问题。 为什么我们不能将所有抽象方法移动到接口?
我知道有模板模式可以使用抽象方法实现,但是它也可以使用Interface完成,所以为什么抽象方法呢。 今天我正在读这个并试图找到答案。
提前致谢。
答案 0 :(得分:2)
接口为对象定义 public 合同。我经常在使用模板模式时使用protected(在Java中)抽象方法,因为我不希望外部调用者能够调用该方法。
有些情况下您可能不需要界面。如果您有类似
的内容怎么办?abstract class MyClass {
someConreteMethod() { ... }
abstract someAbstractMethod();
}
也许您只希望MyClass
的实现扩展抽象MyClass
一般情况下,我并不经常使用 public 抽象方法,但使用非公开方法则更为常见。
答案 1 :(得分:1)
我假设你已经知道了,但接口要求实现者覆盖每个方法。抽象类没有。这很有用的原因是因为您可能希望为扩展该抽象类的所有类提供一个方法实现。
一个简单的例子可能是Person类
abstract class Person{
public void pumpBlood(){
//do blood pumping stuff
}
public void talk();
public void getDressed(Clothes someClothes);
}
所有人都应该(理论上)以同样的方式抽血,但并非所有人都应该穿着衣服或以同样的方式说话。抽象类适用于这样的情况,其中可以提供具体方法。
答案 2 :(得分:1)
这是模板方法模式的一个示例。使用抽象类创建的模板,使用一些终结方法(您不希望更改的逻辑)和抽象方法(通过实现重写)
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";
}
}