Met*_*orm 5 c# inheritance interface class
好的,所以我搞砸了一些东西,特别是接口.
假设我有一个类'Cat',它的基础为'Animal'Fall有一个方法就像这样
public virtual void Walk()
{
// Do walking stuff
}
Run Code Online (Sandbox Code Playgroud)
因此Cat会用以下方式覆盖它:
public override void Walk()
{
// Do cat specific walking stuff
}
Run Code Online (Sandbox Code Playgroud)
简单吧?
这是我的问题,有没有办法强制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();
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生错误
class Dog : Animal
{
public Dog()
{
}
}
Run Code Online (Sandbox Code Playgroud)
Ant*_*ram 17
这是您希望将基类和基本方法标记为abstract.
abstract class Animal
{
public abstract void Walk();
}
Run Code Online (Sandbox Code Playgroud)
派生类必须实现Walk才能实例化.
class Cat : Animal
{
public override void Walk() { }
}
Run Code Online (Sandbox Code Playgroud)
注意:此更改Animal本身不可实例化,对它的所有引用都将通过更多派生类.
Animal animal = new Cat();
Run Code Online (Sandbox Code Playgroud)
这是我的问题,有没有办法强制cat覆盖基本的Walk()方法?因此,如果另一个开发人员添加了Dog类,他们将被迫实现自己的Walk方法(即使它只是base.Walk())?
这是你有一个脱节或相反目标的地方.要强制子项实现方法,请将其标记为抽象.为了让孩子选择使用基本实现,它需要是虚拟的,这将使其成为可选的覆盖.即使你基本上使用模板方法模式,使零部件的算法抽象推入实施下层阶级的,问题是一样的:你不能强迫一个覆盖,同时还留下了默认的实现*.
您需要确定是否要部分或全部具有基本实现.
*你理论上可以abstract void Walk(); protected void WalkImpl() { }在基础上,WalkImpl如果他们不想提供自己的实现,孩子们可以选择调用.
class Cat : Animal
{
protected override void Walk() { base.WalkImpl(); }
}
Run Code Online (Sandbox Code Playgroud)
但是,我不确定我对此的看法.您基本上通过强制覆盖同时仍然允许它们使用默认行为来使派生类的作者生活变得更加困难.如果可以使用默认行为,只需使用virtual并信任派生类的作者,以便在他们认为合适时进行覆盖.