为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
哔哔one 2019-12-27 09:21:32
// Cannot change source codeclass Base{    public virtual void Say()    {        Console.WriteLine("Called from Base.");    }}// Cannot change source codeclass 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.");    }}
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

只想在此处添加此内容,因为即使经过很多时间,人们仍然会回到这个问题。当然,这是不好的做法,但原则上仍然有可能做作者想要做的事情:


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();            

    }

}


查看完整回答
反对 回复 2019-12-27
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

这是一种不良的编程习惯,在C#中是不允许的。这是不好的编程习惯,因为

  • grandbase的细节是base的实现细节;你不应该依赖他们。基类提供了Grandbase的抽象层。您应该使用该抽象,而不是构建旁路来避免这种抽象。

  • 您之所以从您的基础派生出来,是因为您喜欢它的功能,并且想要重用和扩展它。如果您不喜欢它的功能,而是想要解决它而不是使用它,那么为什么您首先要从中得到呢?如果这是您要使用和扩展的功能,请自己从数据库中派生。

  • 该库可能出于安全性或语义一致性目的而需要某些不变式,这些不变式由该库如何使用Grandbase方法的详细信息维护。允许基类的派生类跳过维护那些不变式的代码,可能会使基类处于不一致的损坏状态。


查看完整回答
反对 回复 2019-12-27
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

答案(我知道这不是您要找的东西)是:


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");

    }

}

这样,派生类就可以适当地控制其父母的状态。


查看完整回答
反对 回复 2019-12-27
  • 3 回答
  • 0 关注
  • 454 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信