首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只有抽象方法和接口的抽象类--我应该使用哪一种?

只有抽象方法和接口的抽象类--我应该使用哪一种?
EN

Stack Overflow用户
提问于 2015-03-28 20:07:49
回答 3查看 1.4K关注 0票数 3

请注意。这个问题不是抽象类和接口类的问题。

是。我知道呀。扩展抽象类的类不必覆盖其所有未实现的方法。如果一个子类没有给它的父类的一些未实现的方法下定义,那么子类也将被认为是抽象的。

但是,实现接口的类应该实现它的所有方法(也可以使用接口进行多重继承)。

是只有抽象方法的抽象类和接口之间的唯一区别吗?

我知道了。抽象类可以具有状态和方法实现。但我要把问题说得很清楚。它的实际上不是一个接口与抽象类类似的问题。

在这里,在问题中,抽象类没有任何数据成员或任何方法实现。只是一些抽象的方法。例:

代码语言:javascript
复制
abstract class shape{
    abstract void draw();
}

,我只想知道是否还有其他的区别,。在这种情况下,我应该使用什么?

请帮帮忙。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-28 20:23:26

我相信你的问题不一定是一个对另一个,而是如何知道在一个例子中选择哪一个。

我喜欢这样想的一种方法是,接口往往是用户可以与类进行接口的操作。例如,如果一个类实现了接口可玩,您知道它有一个play方法,不管它是启动音频播放器、启动视频还是启动游戏,都取决于类本身,但您只知道它是一个可玩类,可以play

虽然形状不是一种动作,它是一种类型,形状伴随着属性来定义它,你需要知道颜色、大小等等,才能知道什么是形状。这就是为什么我要使用一个抽象类来定义它们的所有属性。

因为draw()是可以应用于形状、图像或场景的功能,所以我会将其实现为Drawable接口。

示例:

代码语言:javascript
复制
 public class Square extends Shape implements Drawable{

      public void draw(){
          //draw code here
      }
 }

通过这种方式,您可以定义Shape内部的所有公共属性,并提供通过可绘制接口绘制自身的功能。

票数 4
EN

Stack Overflow用户

发布于 2015-03-28 20:18:58

我相信界面在软件设计中有更多的用途。您可以将您的组件实现与接口分离,以便您在以较低的风险更改代码方面具有更大的灵活性。就像控制模式的反转一样,您可以使用接口,然后当您决定时,您可以更改您想要使用的具体实现。接口的其他用途是您可以使用使用接口的拦截器(单位阻断器 )在并非所有这些都是可行的地方执行不同的操作,或者至少使用抽象类进行简单的操作。

票数 2
EN

Stack Overflow用户

发布于 2015-03-28 20:26:10

您在这里提到的情况(当接口和抽象类都只有方法签名和抽象类没有方法的任何部分实现时),我甚至更喜欢接口。由于抽象类没有draw()方法的任何规范,也没有任何字段/属性,因此它实际上是一个接口,导致您的子类无法继承其他必要的类。考虑下面的代码片段-

代码语言:javascript
复制
public class AnySubClass extends Shape{}

现在,AnySubClass无法扩展任何其他子类。但是如果Shape是一个接口,那么AnySubClass可以实现其他接口,或者可以扩展其他一些重要的类。

在一般情况下,接口给您实现方法的自由--实现您自己的方式,但必须实现。但是,在这种情况下,当您想要为您的子类提供如何实现的指导时,应该使用抽象类。此外,您还可以实现多个接口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29321995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档