Oop 抽象方法与接口方法

Oop 抽象方法与接口方法,oop,inheritance,abstraction,ooad,Oop,Inheritance,Abstraction,Ooad,它已经被问了100次,但他们都有不同的答案。所以我敢再次提出这个问题。 为什么我们不能将所有抽象方法移到接口 我知道有一种模板模式可以用抽象方法实现,但也可以用接口实现,所以为什么要用抽象方法呢。 今天我在读这篇文章,试图找到答案 提前感谢。接口为对象定义公共契约。在使用模板模式时,我经常使用受保护的(Java)抽象方法,因为我不希望外部调用方能够调用该方法 在某些情况下,您可能不需要接口。如果你有类似的东西呢 abstract class MyClass { someConreteM

它已经被问了100次,但他们都有不同的答案。所以我敢再次提出这个问题。 为什么我们不能将所有抽象方法移到接口

我知道有一种模板模式可以用抽象方法实现,但也可以用接口实现,所以为什么要用抽象方法呢。 今天我在读这篇文章,试图找到答案

提前感谢。

接口为对象定义公共契约。在使用模板模式时,我经常使用受保护的(Java)抽象方法,因为我不希望外部调用方能够调用该方法

在某些情况下,您可能不需要接口。如果你有类似的东西呢

abstract class MyClass {
     someConreteMethod() { ... }
     abstract someAbstractMethod();
}
也许您只希望实现
MyClass
来扩展抽象
MyClass

一般来说,我不经常使用公共抽象方法,但使用非公共方法更为常见。

接口为对象定义公共约定。在使用模板模式时,我经常使用受保护的(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); 
}

所有人(理论上)都应该以同样的方式抽血,但不是所有人都应该以同样的方式穿着或说话。抽象类适用于可能提供具体方法的情况

我假设您已经知道这一点,但是接口要求实现者覆盖每个方法。抽象类没有。这之所以有用,是因为您可能希望为扩展该抽象类的所有类提供一个方法实现

一个简单的例子可能是Person类

abstract class Person{

public void pumpBlood(){
//do blood pumping stuff 
}

public void talk(); 
public void getDressed(Clothes someClothes); 
}

所有人(理论上)都应该以同样的方式抽血,但不是所有人都应该以同样的方式穿着或说话。抽象类适用于可能提供具体方法的情况

这是模板方法模式的一个示例。一个由抽象类、一些final方法(您不想更改的逻辑)和抽象方法(由实现取消覆盖)组成的模板

公共抽象类HtmlTemplate{
/**
*获取html代码。
*它是最终的,所以没有人可以推翻。
*@return Html代码。
*/
公共最终字符串getHtml(){
字符串html=“”
+ ""
+getHead()//抽象方法
+ ""
+ ""
+getBody()//抽象方法
+ ""
+ "";
返回html;
}
/**
*获取head实现。
*@返回头代码
*/
受保护的抽象字符串getHead();
/**
*获取body实现。
*@返回正文代码
*/
受保护的抽象字符串getBody();
}
公共类MyHtmlPageImpl扩展了HtmlTemplate{
@凌驾
受保护的字符串getHead(){
返回“我的页面”;
}
@凌驾
受保护的字符串getBody(){
返回“你好世界”;
}
}

这是模板方法模式的一个示例。一个由抽象类、一些final方法(您不想更改的逻辑)和抽象方法(由实现取消覆盖)组成的模板

公共抽象类HtmlTemplate{
/**
*获取html代码。
*它是最终的,所以没有人可以推翻。
*@return Html代码。
*/
公共最终字符串getHtml(){
字符串html=“”
+ ""
+getHead()//抽象方法
+ ""
+ ""
+getBody()//抽象方法
+ ""
+ "";
返回html;
}
/**
*获取head实现。
*@返回头代码
*/
受保护的抽象字符串getHead();
/**
*获取body实现。
*@返回正文代码
*/
受保护的抽象字符串getBody();
}
公共类MyHtmlPageImpl扩展了HtmlTemplate{
@凌驾
受保护的字符串getHead(){
返回“我的页面”;
}
@凌驾
受保护的字符串getBody(){
返回“你好世界”;
}
}

谢谢Brad,我的问题更多的是关于抽象的“方法”。它不是在抽象类中实现的,所以为什么不将它移动到接口中呢。也就是说,它是一个接口程序。将所有抽象“方法”移动到接口并在基类或抽象类中保留公共逻辑似乎不正确。我当时误解了您。谢谢Brad,我的问题更多地是关于抽象“方法”。它不是在抽象类中实现的,所以为什么不将它移动到接口中呢。也就是说,它是一个接口程序。将所有抽象“方法”移动到接口并将公共逻辑保留在基类或抽象类中似乎不正确。我当时误解了您。感谢模板示例,这很有意义。但在第二个示例中,我可以为公共逻辑someconcretemethod()创建一个基类,并为someabstractmethod(如果它是公共的)编写一个接口。那么公共抽象方法应该去接口吗?似乎基类在大多数情况下都应该是抽象的。接口有一个含义——您希望能够通过该接口引用对象。如果您不希望有多个不扩展
MyClass
的实现,那么接口就不会