假设我有一个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
方法,并在Sleep
和Animal
类中都重写该方法?因为否则,例如,当您在VS中单击“转到定义”时,它将带您到Cat
类的Sleep
方法,这可能会使另一个开发人员阅读代码感到困惑。
与此相关的最佳做法是什么?
答案 0 :(得分:4)
抽象和虚拟之间的选择与可读性无关。
这是基于功能的设计选择。如果您的基类可以为特定方法提供标准行为,但是子级可以具有自己的特定行为,则使该方法成为虚拟方法。如果没有默认行为,请将该方法设为抽象。
答案 1 :(得分:1)
继承时必须实现抽象等于。 虚拟等于,您继承时可能会或可能不会实现。
您不必担心其他开发人员会去实现功能。 您应该担心要在设计中达到什么目标。
很好地记录您的基类/抽象类,其他人将能够遵循您的代码。
给出全名,例如。SleepWhenButtonClicked ...而不是睡眠
希望这会有所帮助。
答案 2 :(得分:0)
由您决定。
您是否要让使用者创建不是派生类型的Animal
?
Animal
abstract
。 virtual
方法是一种方法。