调用重写方法的grand-parent实现

时间:2012-08-21 09:57:41

标签: c# inheritance

  

可能重复:
  How to call base.base.method()?

我在C#中继承了一些问题。我已经草拟了三个课程:ABCC继承自B的{​​{1}}和B。现在A班级调用B并且工作正常,但我无法从base.Method1班级拨打A.method1。如果我从C致电base.Method1,那么该方法将C method1。有什么建议吗?

P.S。在B类中,有一些字段标记为私有,因此您只能访问它们

A

3 个答案:

答案 0 :(得分:3)

无法在C#中执行此操作,认为可以通过IL执行此操作。

对于您的情况,您可以这样做:

class A
{
    private int instance;
    public virtual void Method1()
    {
        Method1Impl();
    }

    protected void Method1Impl()
    {
    }
}

现在,您可以从C级别致电A.Method1Impl

答案 1 :(得分:3)

这是C#的一个功能。如果您希望将此方法公开给C类,请考虑重构A,如下所示:

class A
{    
  private instance;    
  public virtual void Method1 ()
  {
    AMethod1();       
  }

  protected void AMethod1()
  {
    instance = this;
    do something;       
  }
}

这使您可以在C:

中调用此方法
class C : B
{   
  public override void Method1 ()
  {
    AMethod1();
    // do something;
  }
}

答案 2 :(得分:1)

您无法使用A直接跳至base.Method1,因为这只是针对上述问题。但是,您可以使用受保护的委托或对A的引用来进行直接呼叫。创建受保护的字段Action _A_Method1,并在A的构造函数中,将其设置为Method1_A_Method1 = Method1)。现在,您可以直接调用类C_A_Method1();)。