只有抽象方法和接口的抽象 Class - 我应该使用哪个?
Abstract Class with only abstract methods and Interface - Which should I use?
请注意。这个问题不是抽象的 class vs 接口类的问题。
是的。我知道。扩展抽象 class 的 class 没有必要覆盖其所有未实现的方法。如果子 class 没有定义其父未实现的某些方法,则子 class 也将被视为抽象。
但是实现接口的 class 应该实现它的所有方法(接口也可以实现多重继承)。
这是只有抽象方法的抽象class和接口之间的唯一区别吗?
是的,我明白了。抽象 class 可以有状态和方法实现。
但我把问题说得很清楚了。它 实际上不是接口与抽象 class 这种问题。
这里,在问题中,抽象 class 没有任何数据成员或任何方法实现。只是一些抽象方法而已。
例如:
abstract class shape{
abstract void draw();
}
我只想知道有没有其他的区别。
这种情况应该怎么用?
请帮忙
嗯,我相信接口在软件设计中有更多的用途。
您可以将您的组件实现与接口分离,这样您就可以更灵活地更改代码并降低风险。
就像控制反转模式一样,您可以在其中使用接口,然后当您决定可以更改要使用的具体实现时。
或者接口的其他用途是您可以使用使用接口 (Unity Interceptor) 的拦截器来做不同的事情,其中并非所有这些都是可行的,或者至少使用抽象 类.
一样简单
我相信你的问题不一定是一个与另一个,而是如何知道在一个实例中选择哪个。
我喜欢考虑的一种方式是,界面往往是用户可以使用 界面 和 class 进行的操作。例如,如果 class 实现了接口 playable 你知道它会有一个 play 方法,无论是启动音频播放器、启动视频还是启动游戏都取决于在 class 本身上,但您只知道它是可播放的 class 并且可以 播放 。
而形状不是一个动作,它是一种类型,形状伴随着定义它的属性,你需要知道颜色、大小等,才能知道某物是形状。这就是为什么我会使用抽象 class 来定义它们共有的所有属性。
因为 draw() 是可以应用于形状、图像或场景的功能,所以我会将其实现为 Drawable
界面。
示例:
public class Square extends Shape implements Drawable{
public void draw(){
//draw code here
}
}
这样你就可以在Shape
中定义所有的公共属性,并提供通过Drawable接口绘制自身的功能。
你说的这种情况(当接口和抽象class都只有方法签名而抽象class没有方法的部分实现时)我什至更喜欢接口。由于抽象 class 没有任何 draw()
方法的规范,也没有 field/property 它实际上是一个接口,问题是你的子 class 不能继承其他必要的 class。考虑以下代码片段 -
public class AnySubClass extends Shape{}
现在 AnySubClass
不能扩展任何其他子class。但是如果 Shape
是一个接口,那么 AnySubClass
可以实现其他接口,或者可以扩展一些其他重要的 class。
总的来说,接口给了你实现方法的自由——实现你自己的方式,但必须要实现。但是当你想为你的 subclass 如何实现提供一些指导时,应该在这种情况下使用 abstract class 。而且你可以实现多个接口。
请注意。这个问题不是抽象的 class vs 接口类的问题。
是的。我知道。扩展抽象 class 的 class 没有必要覆盖其所有未实现的方法。如果子 class 没有定义其父未实现的某些方法,则子 class 也将被视为抽象。
但是实现接口的 class 应该实现它的所有方法(接口也可以实现多重继承)。
这是只有抽象方法的抽象class和接口之间的唯一区别吗?
是的,我明白了。抽象 class 可以有状态和方法实现。 但我把问题说得很清楚了。它 实际上不是接口与抽象 class 这种问题。
这里,在问题中,抽象 class 没有任何数据成员或任何方法实现。只是一些抽象方法而已。 例如:
abstract class shape{
abstract void draw();
}
我只想知道有没有其他的区别。 这种情况应该怎么用?
请帮忙
嗯,我相信接口在软件设计中有更多的用途。 您可以将您的组件实现与接口分离,这样您就可以更灵活地更改代码并降低风险。 就像控制反转模式一样,您可以在其中使用接口,然后当您决定可以更改要使用的具体实现时。 或者接口的其他用途是您可以使用使用接口 (Unity Interceptor) 的拦截器来做不同的事情,其中并非所有这些都是可行的,或者至少使用抽象 类.
一样简单我相信你的问题不一定是一个与另一个,而是如何知道在一个实例中选择哪个。
我喜欢考虑的一种方式是,界面往往是用户可以使用 界面 和 class 进行的操作。例如,如果 class 实现了接口 playable 你知道它会有一个 play 方法,无论是启动音频播放器、启动视频还是启动游戏都取决于在 class 本身上,但您只知道它是可播放的 class 并且可以 播放 。
而形状不是一个动作,它是一种类型,形状伴随着定义它的属性,你需要知道颜色、大小等,才能知道某物是形状。这就是为什么我会使用抽象 class 来定义它们共有的所有属性。
因为 draw() 是可以应用于形状、图像或场景的功能,所以我会将其实现为 Drawable
界面。
示例:
public class Square extends Shape implements Drawable{
public void draw(){
//draw code here
}
}
这样你就可以在Shape
中定义所有的公共属性,并提供通过Drawable接口绘制自身的功能。
你说的这种情况(当接口和抽象class都只有方法签名而抽象class没有方法的部分实现时)我什至更喜欢接口。由于抽象 class 没有任何 draw()
方法的规范,也没有 field/property 它实际上是一个接口,问题是你的子 class 不能继承其他必要的 class。考虑以下代码片段 -
public class AnySubClass extends Shape{}
现在 AnySubClass
不能扩展任何其他子class。但是如果 Shape
是一个接口,那么 AnySubClass
可以实现其他接口,或者可以扩展一些其他重要的 class。
总的来说,接口给了你实现方法的自由——实现你自己的方式,但必须要实现。但是当你想为你的 subclass 如何实现提供一些指导时,应该在这种情况下使用 abstract class 。而且你可以实现多个接口。