代码之家  ›  专栏  ›  技术社区  ›  John L.

继承-抽象与虚拟[关闭]

c#
  •  0
  • John L.  · 技术社区  · 8 年前

    假设我有一个 Animal a班 Cat 动物 . 动物 类有一个虚拟的 Sleep 方法和步骤 猫 阶级凌驾于此 睡觉 方法

    class Animal
    {
        .....
    
        public virtual void Sleep()
        {
        .....
        }
    }
    
    class Cat: Animal
    {
        .....
    
        public override void Sleep()
        {
        .....
        }
    }
    

    如果我有 List<Animal> animals 变量并添加这两种类型的对象 动物 和类型 猫 ,当我迭代列表并运行 睡觉 方法 猫 对象将有自己的 睡觉 方法运行。到现在为止,一直都还不错。

    但是在代码可读性和可维护性方面,我应该有一个摘要吗 睡觉 方法,并在两者中都重写该方法 动物 和 猫 上课?因为否则,例如,当你在VS中单击“转到定义”时,它会将你带到 睡觉 调查方法 动物 类,这可能会让另一个阅读代码的开发人员感到困惑。

    这方面的最佳实践是什么?

    3 回复  |  直到 8 年前
        1
  •  4
  •   Frederik Gheysels    8 年前

    抽象和虚拟之间的选择与imo关系不大 可读性 .

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

        2
  •  1
  •   Gilad    8 年前

    继承时必须实现抽象等于。 虚拟等于继承时可以实现,也可以不实现。

    您不应该担心其他开发人员去实现功能。 你应该担心你想在设计中实现什么。

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

    给出全名,比如。。当按钮被点击时睡觉。。。不睡觉

    希望这有帮助。

        3
  •  0
  •   Daniel A. White    8 年前

    这取决于你。

    你想让你的消费者创造一个 Animal 那不是派生类型吗?

    • 如果是这样的话,请 动物 abstract .
    • 如果没有,请 virtual 方法是一种方法。