继承-抽象与虚拟

时间:2018-08-19 19:34:18

标签: c#

假设我有一个Animal类和一个从Cat继承的Animal类。 Animal类具有虚拟的Sleep方法,而Cat类将覆盖该Sleep方法。

class Animal
{
    .....

    public virtual void Sleep()
    {
    .....
    }
}

class Cat: Animal
{
    .....

    public override void Sleep()
    {
    .....
    }
}

如果我有一个List<Animal> animals变量并添加类型Animal和类型Cat的对象,则当我遍历列表并运行Sleep方法时,{{1 }}对象将运行自己的Cat方法。到目前为止一切顺利。

但是就代码的可读性和可维护性而言,我是否应该在其他地方使用抽象的Sleep方法,并在SleepAnimal类中都重写该方法?因为否则,例如,当您在VS中单击“转到定义”时,它将带您到Cat类的Sleep方法,这可能会使另一个开发人员阅读代码感到困惑。

与此相关的最佳做法是什么?

3 个答案:

答案 0 :(得分:4)

抽象和虚拟之间的选择与可读性无关。

这是基于功能的设计选择。如果您的基类可以为特定方法提供标准行为,但是子级可以具有自己的特定行为,则使该方法成为虚拟方法。如果没有默认行为,请将该方法设为抽象。

答案 1 :(得分:1)

继承时必须实现抽象等于。 虚拟等于,您继承时可能会或可能不会实现。

您不必担心其他开发人员会去实现功能。 您应该担心要在设计中达到什么目标。

很好地记录您的基类/抽象类,其他人将能够遵循您的代码。

给出全名,例如。SleepWhenButtonClicked ...而不是睡眠

希望这会有所帮助。

答案 2 :(得分:0)

由您决定。

您是否要让使用者创建不是派生类型的Animal

  • 如果是这样,请制作Animal abstract
  • 否则,virtual方法是一种方法。