它已被问了100次,但他们都有不同的答案。所以我敢再次提出这个问题。 为什么我们不能将所有的抽象方法移动到界面上?抽象方法vs接口方法
我知道有模板模式可以使用抽象方法来实现,但是它也可以使用接口来完成,所以为什么抽象方法是根本。 今天我正在阅读关于此并试图找到答案。
在此先感谢。
它已被问了100次,但他们都有不同的答案。所以我敢再次提出这个问题。 为什么我们不能将所有的抽象方法移动到界面上?抽象方法vs接口方法
我知道有模板模式可以使用抽象方法来实现,但是它也可以使用接口来完成,所以为什么抽象方法是根本。 今天我正在阅读关于此并试图找到答案。
在此先感谢。
一个接口定义了一个对象的公开契约。在使用模板模式时,我经常使用protected(使用Java)抽象方法,因为我不希望外部调用者能够调用该方法。
有可能您不想要接口的情况。如果你有这样的事情
abstract class MyClass {
someConreteMethod() { ... }
abstract someAbstractMethod();
}
也许你只想要MyClass
实现扩展抽象MyClass
一般情况下,我不经常使用公共抽象方法,但有非公立更常见。
我假设你已经知道这一点,但接口要求实现者覆盖每个方法。抽象类没有。这很有用的原因是因为您可能想要为扩展该抽象类的所有类提供一个方法实现。
一个简单的例子可能是一类人以同样的方式
abstract class Person{
public void pumpBlood(){
//do blood pumping stuff
}
public void talk();
public void getDressed(Clothes someClothes);
}
所有的人都应该(理论上)泵血但不是都应该getDressed或说话的方式相同。抽象类适用于这种情况下可能提供具体方法的情况。
这是一个模板方法模式的例子。用抽象类制作一个模板,用一些决赛方法(你不想改变的逻辑)和抽象方法(由实现重写)
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";
}
}
感谢,与HTML方面不同的观点。 – snail
感谢模板的例子,这里有道理。但在第二个例子中,我可以为通用逻辑someconcretemethod()创建一个基类,并为someabstract方法编写一个接口,如果它是公共的。所以公共抽象方法应该去接口?大多数时候,似乎基本分类应该是抽象的。 – snail
@jeff好点 – Brad
一个接口有一个含义 - 你希望能够通过该接口引用一个对象。如果你不想有多个不能扩展'MyClass'的实现,那么一个接口就没有意义了。有时候这只是一个判断。 –