9

可能重复:
如何调用 base.base.method()?

我在 C# 中的继承遇到了一些麻烦。我画了三个类ABCC继承自B和。现在班级打电话并且工作正常,但我不能从班级打电话。如果我显然调用该方法将是. 有什么建议吗?BABbase.Method1A.method1Cbase.Method1Cmethod1B

PS 在A课堂上有一些标记为私有的字段,因此您只能访问它们

class A
{    
    private instance;    
    public virtual void Method1 ()
    {       
        instance = this;
        do something;       
    }
}

class B : A
{
    public override void Method1()
    {
        base.Method1();
        do something;       
    }
}

class C : B
{   
    public override void Method1 ()
    {
        //need A Method1 then do something
    }
}
4

3 回答 3

5

这是 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;
  }
}
于 2012-08-21T10:05:53.647 回答
4

在 C# 中不可能做到这一点,认为可以通过 IL 做到这一点。

对于您的情况,您可以执行以下操作:

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

    protected void Method1Impl()
    {
    }
}

现在您可以A.Method1Impl从您的 C 类调用。

于 2012-08-21T10:05:27.203 回答
1

你不能直接跳到Ausing base.Method1,因为那只是上面的那个。但是,您可以使用受保护的委托或对 A 的引用来进行直接调用。创建一个受保护的字段Action _A_Method1,并在 的构造函数A中将其设置为Method1( _A_Method1 = Method1)。现在您可以使用类C( _A_Method1();) 中的直接调用。

于 2012-08-21T10:02:54.117 回答