9

重複の可能性:
base.base.method() を呼び出すには?

C# の継承に問題があります。ABおよびの 3 つのクラスをスケッチしましCた。とからC継承します。クラスが呼び出されて正常に動作するようになりましたが、クラスから呼び出すことはできません。明らかにfromを呼び出すと、そのメソッドはof になります。何かアドバイス?BBABbase.Method1A.method1Cbase.Method1Cmethod1B

PSAクラスには、プライベートとマークされたフィールドがいくつかあるため、それらにのみアクセスできます

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

上記の1つだけであるため、をA使用するように直接スキップすることはできません。base.Method1ただし、保護されたデリゲートまたはAへの参照を使用して、直接電話をかけることができます。保護フィールドAction _A_Method1を作成し、のコンストラクターで( )Aに設定します。これで、クラス( )から直接呼び出すことができます。Method1_A_Method1 = Method1C_A_Method1();

于 2012-08-21T10:02:54.117 に答える