C# 类继承,强制新类实现某些函数
好的,所以我在处理一些事情,特别是接口 假设我有一个类“Cat”,它的基础是“Animal”,Animal在其中有一个方法,如下所示C# 类继承,强制新类实现某些函数,c#,class,inheritance,interface,C#,Class,Inheritance,Interface,好的,所以我在处理一些事情,特别是接口 假设我有一个类“Cat”,它的基础是“Animal”,Animal在其中有一个方法,如下所示 public virtual void Walk() { // Do walking stuff } 所以Cat会用以下命令覆盖它: public override void Walk() { // Do cat specific walking stuff } 简单对吧 我的问题是,有没有办法强制cat重写base Walk()方法?所以,如
public virtual void Walk()
{
// Do walking stuff
}
所以Cat会用以下命令覆盖它:
public override void Walk()
{
// Do cat specific walking stuff
}
简单对吧
我的问题是,有没有办法强制cat重写base Walk()方法?所以,如果另一个开发人员添加了一个Dog类,他们将被迫实现自己的Walk方法(即使它只是base.Walk())
接口解决了这个问题,这就是我尝试过的
猫:动物:界面
动物必须执行步行法,但猫没有
猫:动物,界面
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()
{
}
}
此时,您需要将基类和基法标记为
abstract
abstract class Animal
{
public abstract void Walk();
}
派生类必须实现Walk
才能实例化
class Cat : Animal
{
public override void Walk() { }
}
注意:此更改使Animal
本身不可实例化,对它的所有引用都将通过更多派生类进行
Animal animal = new Cat();
这是我的问题,有没有办法强迫cat超越
base Walk()方法因此,如果另一个开发人员添加了一个Dog类
将被迫实施自己的步行方法(即使是
只需base.Walk())
这就是你有一个脱节,或相反的目标。若要强制子对象实现方法,请将其标记为抽象。为了允许子级选择使用基本实现,它需要是虚拟的,这样就可以选择重写。即使您基本上使用模板方法模式,并将部分算法抽象以将实现推入较低的类中,问题仍然是一样的:您不能在保留默认实现的同时强制重写*
您需要确定是否希望有一个部分或全部的基本实现
*理论上你可以选择
抽象的void Walk();在基中受保护的void walkinpl(){}
,这将允许孩子们选择调用walkinpl
,如果他们不想提供自己的实现
class Cat : Animal
{
protected override void Walk() { base.WalkImpl(); }
}
然而,我不确定我对此有何感想。通过强制重写,同时仍然允许派生类使用默认行为,基本上使派生类的作者的生活更加困难。如果可以使用默认行为,只需使用
virtual
,并信任派生类的作者在他们认为合适时进行重写。感谢您的快速回复,问题在于“public abstract void Walk();”无法有任何实现,因此无法执行base.Walk(),我刚刚在一个注释中完成了编辑。检查修订版。我已经在我的帖子中添加了一个编辑,请看看这是否可行。你想要的是:不。检查最新的修订版,了解我不推荐的方法,但是我觉得这是你能得到的最接近的了。谢谢安东尼。我会考虑一下我真正想做什么,以及根据你给我的建议,这是否可行。