如何调用base.base.method()?

// Cannot change source code

class Base

{

    public virtual void Say()

    {

        Console.WriteLine("Called from Base.");

    }

}


// Cannot change source code

class Derived : Base

{

    public override void Say()

    {

        Console.WriteLine("Called from Derived.");

        base.Say();

    }

}


class SpecialDerived : Derived

{

    public override void Say()

    {

        Console.WriteLine("Called from Special Derived.");

        base.Say();

    }

}


class Program

{

    static void Main(string[] args)

    {

        SpecialDerived sd = new SpecialDerived();

        sd.Say();

    }

}

结果是:


从特殊派生调用。

从派生调用。/ *这不是预期的* /

从Base调用。


我如何重写SpecialDerived类,以便不调用中间类“ Derived”的方法?


更新: 我想从Derived而不是Base继承的原因是Derived类包含许多其他实现。由于无法在base.base.method()此处执行操作,因此我认为最好的方法是执行以下操作?


//无法更改源代码


class Derived : Base

{

    public override void Say()

    {

        CustomSay();


        base.Say();

    }


    protected virtual void CustomSay()

    {

        Console.WriteLine("Called from Derived.");

    }

}


class SpecialDerived : Derived

{

    /*

    public override void Say()

    {

        Console.WriteLine("Called from Special Derived.");

        base.Say();

    }

    */


    protected override void CustomSay()

    {

        Console.WriteLine("Called from Special Derived.");

    }

}


哔哔one
浏览 461回答 3
3回答

慕标琳琳

只想在此处添加此内容,因为即使经过很多时间,人们仍然会回到这个问题。当然,这是不好的做法,但原则上仍然有可能做作者想要做的事情:class SpecialDerived : Derived{    public override void Say()    {        Console.WriteLine("Called from Special Derived.");        var ptr = typeof(Base).GetMethod("Say").MethodHandle.GetFunctionPointer();                    var baseSay = (Action)Activator.CreateInstance(typeof(Action), this, ptr);        baseSay();                }}

扬帆大鱼

这是一种不良的编程习惯,在C#中是不允许的。这是不好的编程习惯,因为grandbase的细节是base的实现细节;你不应该依赖他们。基类提供了Grandbase的抽象层。您应该使用该抽象,而不是构建旁路来避免这种抽象。您之所以从您的基础派生出来,是因为您喜欢它的功能,并且想要重用和扩展它。如果您不喜欢它的功能,而是想要解决它而不是使用它,那么为什么您首先要从中得到呢?如果这是您要使用和扩展的功能,请自己从数据库中派生。该库可能出于安全性或语义一致性目的而需要某些不变式,这些不变式由该库如何使用Grandbase方法的详细信息维护。允许基类的派生类跳过维护那些不变式的代码,可能会使基类处于不一致的损坏状态。

qq_遁去的一_1

答案(我知道这不是您要找的东西)是:class SpecialDerived : Base{    public override void Say()    {        Console.WriteLine("Called from Special Derived.");        base.Say();    }}事实是,您只能与您继承的类进行直接交互。将该类视为一个层-根据其派生类的需要,提供或多或少提供其父类的功能。编辑:您的编辑有效,但我想我会使用以下内容:class Derived : Base{    protected bool _useBaseSay = false;    public override void Say()    {        if(this._useBaseSay)            base.Say();        else            Console.WriteLine("Called from Derived");    }}当然,在实际的实现中,您可能会为扩展性和可维护性做更多类似的事情:class Derived : Base{    protected enum Mode    {        Standard,        BaseFunctionality,        Verbose        //etc    }    protected Mode Mode    {        get; set;    }    public override void Say()    {        if(this.Mode == Mode.BaseFunctionality)            base.Say();        else            Console.WriteLine("Called from Derived");    }}这样,派生类就可以适当地控制其父母的状态。
打开App,查看更多内容
随时随地看视频慕课网APP