请注意。这个问题不是抽象类与接口类型的问题。
是。我知道。扩展抽象类的类不必覆盖所有未实现的方法。如果子类没有给它的一些未实现的方法赋予定义,那么子类也将被认为是抽象的。
但是实现接口的类应该实现它的所有方法(接口也可以进行多重继承)。
这是仅具有抽象方法的抽象类与接口之间的唯一区别吗?
是的,我理解。 Abstract类可以具有状态和方法实现。 但我提出的问题非常清楚。它的实际上并不是一个界面与抽象类的问题。在这个问题中,抽象类没有任何数据成员或任何方法实现。只是一些抽象的方法。 例如:
abstract class shape{
abstract void draw();
}
我只是想知道是否还有其他差异。 在这种情况下我应该使用什么?
请帮忙。
答案 0 :(得分:4)
我相信你的问题不一定是对方,而是如何知道在一个实例中选择哪一个。
我喜欢考虑的一种方式是接口往往是用户可以使用该类与接口一起使用的操作。例如,如果一个类实现了接口可播放,你知道它会有一个播放方法,无论是启动音频播放器,启动视频还是开始游戏都取决于类本身,但是你只知道它是一个可玩的课程,可以播放。
虽然形状不是动作,但它是一种类型,形状带有属性来定义它,你需要知道颜色,大小等,以便知道什么是形状。这就是为什么我会使用抽象类来定义它们共有的所有属性。
因为draw()是可以应用于形状,图像或场景的功能,所以我将其实现为Drawable
接口。
示例:强>
public class Square extends Shape implements Drawable{
public void draw(){
//draw code here
}
}
通过这种方式,您可以定义Shape
内的所有常见属性,并提供通过Drawable接口绘制自身的功能。
答案 1 :(得分:2)
我相信Interfaces在软件设计中有更多用途。 您可以将组件实现与接口分离,以便您以更低的风险更灵活地更改代码。 像Inversion of Control模式一样,您可以使用接口,然后在您决定可以更改要使用的具体实现时。 或者接口的其他用途是你可以使用拦截器使用接口(Unity Interceptor)来做不同的事情,其中并非所有这些都是可行的,或者至少使用抽象类是直截了当的。
答案 2 :(得分:1)
你在这里说的情况(当接口和抽象类只有方法签名和抽象类没有方法的任何部分实现时)我更喜欢接口。由于抽象类没有draw()
方法的任何规范,也没有字段/属性,因此它实际上是一个问题的接口,强制你的子类不继承其他必要的类。请考虑以下代码段 -
public class AnySubClass extends Shape{}
现在AnySubClass
无法扩展任何其他子类。但是如果Shape
是一个接口,那么AnySubClass
可以实现其他接口,或者可以扩展其他一些重要的类。
在一般界面中,您可以自由地实现该方法 - 实现您自己的方式,但必须实现。但是,当您想要为子类提供一些如何实现的指导时,应该使用抽象类。而且你可以实现多个接口。