行为的默认实现
本文关键字:实现 默认 | 更新日期: 2023-09-27 17:56:51
>场景
有三种类型的车辆
- 在陆地上移动的车辆。
- 在水上移动的车辆。
- 在空中移动的车辆。
所有类型的车辆都有一个共同的行为,都可以移动。但是它们的移动方式完全不同(车辆移动的媒介)。
这意味着,所有车辆都有共同的行为(Move)但完全独特的实现。
问题1
在这种情况下,我们可以有一个带有虚拟函数 (Move) 的基类和一些默认实现吗,因为所有车辆都有完全不同的实现?
或
抽象类会是这种设计的好方法吗,因为我们没有任何默认实现?
问题2
当我们没有默认实现时,我们应该使用抽象方法吗?(只是为了确认其他情况)
有点模糊的问题,我想你可能在做功课。
首先,虚拟方法将允许您编写一些默认行为,所有子类都将继承这些行为,但可以选择用自己的子类替换。
基本上,你需要问问自己,是否有任何共同的行为,作为公共接口的
附加?想想音乐播放器。界面是什么?让我们停止,快进,快退和播放。
这是接口的一个很好的例子。所有默认的"行为"都由方法的名称描述。
CD播放器的"播放"方式与MP3播放器的"播放"方式完全不同。以上是抽象方法的示例。
如果这是你所有必需的行为,你不需要抽象类,你需要一个接口。
但是,现在考虑一个倒回到开头并播放的按钮。这是虚拟方法的一个很好的例子,你需要一个抽象类来实现它。您可以根据已经编写的抽象方法提供默认实现,它将正常工作(忽略检测轨道;)的开头)。此外,子类能够根据需要覆盖行为。
回答您的问题:
问题1:我会说不;Move 应该是抽象的,因为没有默认实现(尽管默认隐含行为)
问题 2:是的,如果您没有默认实现,请使用抽象。虽然,如果你发现你的类完全由抽象方法组成,问问自己,你是否最好定义一个接口。
问题 1
是的,抽象类将是这种设计的好方法,因为我们没有任何默认实现?
问题2
是的,当我们没有默认实现时,我们使用抽象方法。
由于你没有任何Vehicle
不是Land
、Water
或Air
,你可能想要一个abstract
类。
方法也一样:如果实现总是不同的(即你总是必须重新定义实现),abstract
就可以了。
如果没有共享实现,则接口将完成这项工作。