行为的默认实现

时间:2013-01-30 12:27:40

标签: c# oop

情景

车辆有三种类型

  1. 在陆地上移动的车辆。
  2. 在水上移动的车辆。
  3. 在Air中移动的车辆。
  4. 所有类型的车辆都有一种共同的行为,一切都可以移动。但他们移动的方式完全不同(车辆移动的媒介)。

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

    问题1

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

    OR

    由于我们没有任何默认实现,抽象类是否适用于此设计?

    问题2

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

3 个答案:

答案 0 :(得分:0)

问题1

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

问题2

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

答案 1 :(得分:0)

由于您没有VehicleLandWater,您可能需要Air类。

方法相同:如果实现总是不同(即你总是需要重新定义实现),abstract就可以了。

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

答案 2 :(得分:0)

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

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

基本上,你需要问问自己,是否有任何常见的行为,与普通界面相似?

想想一个音乐播放器。什么是界面?让我们停下来,快进,快退和玩耍。

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

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

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

然而,现在想到一个倒带直到开始和播放的按钮。这是一个虚拟方法的一个很好的例子,你需要一个抽象类来实现它。你可以提供一个基于你已经编写的抽象方法的默认实现,它只会起作用(忽略检测的开始)轨道 ;))。此外,子类可以在需要时覆盖行为。

回答你的问题:

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

问题2:如果您没有默认实现,请使用摘要。虽然,如果你发现你的课程完全由抽象方法组成,那么问问自己是否最好定义一个界面。