Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类继承,强制新类实现某些函数_C#_Class_Inheritance_Interface - Fatal编程技术网

C# 类继承,强制新类实现某些函数

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()方法?所以,如

好的,所以我在处理一些事情,特别是接口

假设我有一个类“Cat”,它的基础是“Animal”,Animal在其中有一个方法,如下所示

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(),我刚刚在一个注释中完成了编辑。检查修订版。我已经在我的帖子中添加了一个编辑,请看看这是否可行。你想要的是:不。检查最新的修订版,了解我不推荐的方法,但是我觉得这是你能得到的最接近的了。谢谢安东尼。我会考虑一下我真正想做什么,以及根据你给我的建议,这是否可行。