Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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#_Oop - Fatal编程技术网

C# 如何跳过即时基类重写函数

C# 如何跳过即时基类重写函数,c#,oop,C#,Oop,我有下面的类结构,有很多类,比如从B派生的C,在一些类中我不希望由B.OnShow()执行,但我希望A.OnShow()从C执行有什么技巧吗 abstract class A { protected virtual void OnShow() { //some code base.OnShow(); } } class B : A { protected override void OnShow() { //some

我有下面的类结构,有很多类,比如从B派生的C,在一些类中我不希望由B.OnShow()执行,但我希望A.OnShow()从C执行有什么技巧吗

abstract class A
{
   protected virtual void OnShow()
   {
        //some code
        base.OnShow();
   }
}

class B : A
{
    protected override void OnShow()
    {
      //some other code
      base.OnShow();
    }
}

class C : B
{
   protected override void OnShow()
   {
      //some other code
      base.OnShow();
   }
}

已经回答了一个问题,基本上说它在C#中是不允许的。

这听起来像是一个设计问题。如果C真的是ab,那么它可能会完成B在OnShow中需要做的所有事情。如果不是,您可能应该使用直接继承以外的东西,或者使用单个虚拟函数调用以外的东西

如果你真的想,你可以:

abstract class A
{
    protected virtual void OnShow()
    {
        UniqueOnShowStuff();
        base.OnShow();
    }
    protected virtual void UniqueOnShowStuff()
    {
     //
    }
}

class B : A
{
    protected override void OnShow()
    {
        // Things all B's need to Show
        base.OnShow();
    }
    protected override void UniqueOnShowStuff()
    {
        // Things most B's might want to show but don't have to
    }
}

class C : B
{
    protected override void OnShow()
    {
        // Things all C's need to show
        base.OnShow();
    }
    protected override void UniqueOnShowStuff()
    {
        // override without a base call so you don't show B's things
    }
}

这是一个可怕的模式,如果你能想出一个更好的方法来重新设计对象/功能的话,我不建议你这么做。

不要让C从B扩展,而是创建一个新的类“X”,它从a扩展,并且拥有你想要的B和C当前在B中的部分,然后让C和B从“X”扩展。然后,B将只包含你想要的B的位(有点抽象,但我认为这是有意义的)

一般来说,如果您试图跳过父方法,那么您就做错了。

可能重复的