好的,所以我搞砸了一些东西,特别是接口。
假设我有一个“猫”类,其基础为“动物”动物有一个方法就像这样
public virtual void Walk()
{
// Do walking stuff
}
所以Cat会用:
覆盖它public override void Walk()
{
// Do cat specific walking stuff
}
简单吧?
这是我的问题,是否有办法强制cat覆盖基本的Walk()方法?因此,如果另一个开发人员添加了Dog类,他们将被迫实现自己的Walk方法(即使它只是base.Walk())?
所以接口解决了这个问题,这就是我试过的
猫:动物:界面 Animal必须实现Walk方法,但Cat不会
猫:动物,界面 Cat必须实现Walk方法,但如果开发人员没有添加或忘记',接口',那么它将“破坏”它。
有人可以给我一些指针来解决这个问题吗?
感谢。
修改1
这就是我的目标,我希望它能让它更清晰。
public class Animal
{
public Animal()
{
Console.WriteLine("Animal");
}
public virtual void Walk()
{
}
}
public class Cat : Animal
{
public Cat() : base()
{
Console.WriteLine("Cat");
}
public override void Walk()
{
}
}
class Dog : Animal
{
public Dog()
{
}
public override void Walk()
{
// Dog implementation
// and / or calls base method
base.Walk();
}
}
这会产生错误
class Dog : Animal
{
public Dog()
{
}
}
答案 0 :(得分:17)
这时您要将基类和基本方法标记为abstract
。
abstract class Animal
{
public abstract void Walk();
}
派生类必须实现Walk
才能实例化。
class Cat : Animal
{
public override void Walk() { }
}
注意:此更改使Animal
本身不可实例化,对它的所有引用都将通过更多派生类。
Animal animal = new Cat();
这是我的问题,有没有办法强迫猫改写 基础Walk()方法? 因此,如果另一位开发人员添加了Dog类, 将被迫实施自己的Walk方法(即使它是 只是base.Walk())?
这是你有一个脱节或相反目标的地方。要强制子项实现方法,请将其标记为抽象。为了让孩子选择使用基本实现,它需要是虚拟的,这将使其成为可选的覆盖。即使您基本上使用模板方法模式并使算法摘要的部件将实现推送到较低的类,问题仍然是相同的:您也不能强制覆盖,同时保留默认实现*
您需要确定是否要部分或全部拥有基础实施。
*理论上,你可以在基数中使用abstract void Walk(); protected void WalkImpl() { }
,如果他们不想提供自己的实现,孩子们可以选择调用WalkImpl
。
class Cat : Animal
{
protected override void Walk() { base.WalkImpl(); }
}
但是,我不确定我对此的看法。您基本上通过强制覆盖同时仍然允许它们使用默认行为来使派生类的作者生活变得更加困难。 如果可以使用默认行为,只需使用virtual
并信任派生类的作者,以便在他们认为合适的时候覆盖。