类inheritance,强制新类实现某些function
好吧,我正在搞乱一些事情,特别是接口。
假设我有一个“猫”类,其基础为“动物”动物有一个方法就像这样
public virtual void Walk() { // Do walking stuff }
因此Cat会用以下方式覆盖它:
public override void Walk() { // Do cat specific walking stuff }
简单吧?
这是我的问题,有没有办法强制cat覆盖基本的Walk()方法? 因此,如果另一个开发人员添加了Dog类,他们将被迫实现自己的Walk方法(即使它只是base.Walk())?
所以接口就解决了这个问题,这就是我所尝试过的
Cat:Animal:Interface Animal必须实现Walk方法,但Cat不支持
Cat:Animal,Interface Cat必须实现Walk方法,但如果开发人员没有添加或忘记’,Interface’那么它将“打破”它。
有人可以给我一些指针来解决这个问题吗?
谢谢。
编辑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() { } }
这是您希望将基类和基本方法标记为abstract
。
abstract class Animal { public abstract void Walk(); }
派生类必须实现Walk
才能实例化。
class Cat : Animal { public override void Walk() { } }
注意:此更改使Animal
本身不可实例化,对它的所有引用都将通过更多派生类。
Animal animal = new Cat();
这是我的问题,有没有办法强制cat覆盖基本的Walk()方法? 因此,如果另一个开发人员添加了Dog类,他们将被迫实现自己的Walk方法(即使它只是base.Walk()) ?
这是你有一个脱节或相反目标的地方。 要强制子项实现方法,请将其标记为抽象。 为了让孩子选择使用基本实现,它需要是虚拟的,这将使其成为可选的覆盖。 即使您基本上使用模板方法模式并将算法的一部分抽象化以将实现推送到较低的类中,问题仍然是相同的:您不能强制覆盖同时保留默认实现。*
您需要确定是否要部分或全部具有基本实现。
*理论上你可以有abstract void Walk(); protected void WalkImpl() { }
abstract void Walk(); protected void WalkImpl() { }
在基础中,如果他们不想提供自己的实现,它们将允许孩子选择调用WalkImpl
。
class Cat : Animal { protected override void Walk() { base.WalkImpl(); } }
但是,我不确定我对此的看法。 您基本上通过强制覆盖同时仍然允许它们使用默认行为来使派生类的作者生活更加困难。 如果可以使用默认行为,只需使用派生类的virtual
和信任作者在他们认为合适时进行覆盖。