情景
车辆有三种类型
所有类型的车辆都有一种共同的行为,一切都可以移动。但他们移动的方式完全不同(车辆移动的媒介)。
这意味着,所有车辆都有共同的行为(移动)但完全独特的实施。
问题1
在这种情况下,我们是否可以拥有一个带有虚函数(Move)的基类和一些默认实现,因为所有车辆都有完全不同的实现?
OR
由于我们没有任何默认实现,抽象类是否适用于此设计?
问题2
当我们没有默认实现时,我们应该使用抽象方法吗? (只是为了确认其他情况)
答案 0 :(得分:0)
问题1
是的,抽象类是这个设计的好方法,因为我们没有任何默认实现?
问题2
是的,当我们没有默认实现时,我们使用抽象方法。
答案 1 :(得分:0)
由于您没有Vehicle
,Land
或Water
,您可能需要Air
类。
方法相同:如果实现总是不同(即你总是需要重新定义实现),abstract
就可以了。
如果没有共享实现,那么接口就可以完成这项工作。
答案 2 :(得分:0)
有点模糊的问题,我想你可能正在做作业。
首先,虚拟方法允许您编写一些所有子类将继承的默认行为,但可以选择替换它们自己的行为。
基本上,你需要问问自己,是否有任何常见的行为,与普通界面相似?
想想一个音乐播放器。什么是界面?让我们停下来,快进,快退和玩耍。
这是一个很好的界面示例。所有默认的“行为”都由方法名称描述。
CD播放器“播放”的方式与MP3播放器“播放”的方式完全不同。以上是抽象方法的例子。如果这是您所需的所有行为,则不需要抽象类,您需要一个接口。
然而,现在想到一个倒带直到开始和播放的按钮。这是一个虚拟方法的一个很好的例子,你需要一个抽象类来实现它。你可以提供一个基于你已经编写的抽象方法的默认实现,它只会起作用(忽略检测的开始)轨道 ;))。此外,子类可以在需要时覆盖行为。
回答你的问题:
问题1:我会说不; Move应该是抽象的,因为没有默认实现(尽管默认隐含行为)
问题2:如果您没有默认实现,请使用摘要。虽然,如果你发现你的课程完全由抽象方法组成,那么问问自己是否最好定义一个界面。