-1

设想

车辆分为三种

  1. 在陆地上移动的车辆。
  2. 在水上移动的车辆。
  3. 在空中移动的车辆。

所有类型的车辆都有一个共同的行为,都可以移动。但是它们移动的方式完全不同(车辆移动的媒介)。

这意味着,所有车辆都有共同的行为(移动)但完全独特的实现。

问题 1

在这种情况下,我们能否有一个带有虚函数(Move)的基类和一些默认实现,因为所有车辆都有完全不同的实现?

或者

由于我们没有任何默认实现,因此抽象类会成为这种设计的好方法吗?

问题2

当我们没有默认实现时,我们应该使用抽象方法吗?(只是为了确认其他场景)

4

3 回答 3

0

问题 1

是的,抽象类将是这种设计的好方法,因为我们没有任何默认实现?

问题2

是的,当我们没有默认实现时,我们使用抽象方法。

于 2013-01-30T12:30:56.783 回答
0

因为你没有任何Vehicle不是的LandWater或者Air,你可能想要一abstract门课。

方法也一样:如果实现总是不同的(即你总是必须重新定义实现),那abstract很好。

如果没有共享实现,那么接口就可以完成这项工作。

于 2013-01-30T12:31:34.263 回答
0

有点模糊的问题,我认为你可能正在做作业。

首先,虚拟方法将允许您编写一些所有子类都将继承的默认行为,但可以选择用它们自己的替换。

基本上,您需要问自己,与通用界面相比,是否有任何共同的行为?

想想音乐播放器。接口是什么?让我们停止,快进,倒带和播放。

这是一个很好的接口示例。所有默认的“行为”都由方法的名称描述。

CD 播放器“播放”的方式与 MP3 播放器的“播放”方式完全不同。以上将是抽象方法的示例。

如果这是您所需要的所有行为,那么您不需要抽象类,您需要一个接口。

但是,现在想一个按钮,它可以倒回开始并播放。这是一个很好的虚方法示例,您将需要一个抽象类来实现它。您可以基于您已经编写的抽象方法提供一个默认实现,它会正常工作(忽略检测开头轨道 ;))。此外,子类可以根据需要覆盖行为。

回答你的问题:

问题1:我会说不;移动应该是抽象的,因为没有默认实现(尽管默认的隐含行为)

问题 2:是的,如果您没有默认实现,请使用抽象。虽然,如果你发现你的类完全由抽象方法组成,问问你自己是否最好定义一个接口。

于 2013-01-30T12:34:36.710 回答