好吧,我正在搞一些事情,特别是接口。
假设我有一个类“猫”,其基础为“动物”动物有一个方法,如下所示
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 方法,但如果开发人员没有添加或忘记了“,Interface”,那么它就会“破坏”它。
有人可以给我一些指导来解决这个问题吗?
Thanks.
Edit 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()) ?
这就是你们之间存在脱节或相反目标的地方。为了强迫孩子们实现一个方法,你可以将它标记为抽象的。为了允许子进程选择使用基本实现,它需要是虚拟的,这样就可以选择重写它。即使您基本上使用模板方法模式并制作parts算法抽象将实现推入较低的类,问题仍然相同:您不能在保留默认实现的同时强制覆盖。*
您需要确定是否想要部分或全部基础实现。
*理论上你可以有abstract void Walk(); protected void WalkImpl() { }
在基地,这将允许孩子们选择调用WalkImpl
如果他们不想提供自己的实现。
class Cat : Animal
{
protected override void Walk() { base.WalkImpl(); }
}
不过,我不确定我对此有何感受。通过强制覆盖,同时仍然允许派生类的作者使用默认行为,基本上使派生类的作者的生活变得更加困难。如果可以使用默认行为,只需使用virtual
并信任派生类的作者在何时覆盖they感觉很合适。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)