4

私はこれを持っています:

public class Base {
   public virtual void Connect()
   {
      // do stuff
   }
}

public class Derived1 : Base {
   public override void Connect()
   {
       base.Connect();
      // do other stuff
   }
}

public class Derived2 : Derived {
   public override void Connect()
   {
      base.Connect() // Here I want to call Base::Connect(), not Derived::Connect()
   }
}

Derived1::Connect() から「他のことをする」部分をスキップしたいので、Derived2 から Base::Connect を呼び出す方法はありますか?

編集:Derived1から派生したことは必須です。

4

2 に答える 2

3

Connect を 2 つの関数に分割しDoConnectて、必要に応じてすべての派生クラスから呼び出すことができます。

public class Base {
   public virtual void Connect()
   {
      DoConnect();
   }

   protected void DoConnect()
   {
      // do stuff
   }
}

...

public class Derived2 : Derived1 {
   public override void Connect()
   {
      DoConnect();
      ...
   }
}

基本クラスを更新できない場合は、この分割を次の場所で行うことができますDerived1

public class Derived1 : Base {
   public virtual void Connect()
   {
      DoConnect();
   }

   protected void DoConnect()
   {
      base.Connect();
   }
}
于 2013-06-19T16:30:23.867 に答える
1

base.base.method()C# は、最初に設計を変更する必要があることを直接呼び出す方法を提供しません。
親切にこの回答を確認してくださいWhy-c-sharp-doesnt-support-base-base

そのため、小さなトリックや回避策を作成するには、デザインを少し変更する必要があります。

  1. Derived1呼び出すだけの新しいメソッドをクラスに定義しますbase.Connect()
  2. 次に、クラスで、前のステップで定義された前の関数を呼び出すだけの をDerived2()定義します。Connect()

この例を確認してください:

public class Base {
    public virtual void Connect() {
        // do stuff
    }
}

public class Derived1: Base {
    public override void Connect() {
        base.Connect();
        // do other stuff
    }
    public void CallBaseConnnect() {
        //here make only one call to base.Connect(). 
        //that's how class Derived1 'll provide you away to call base.Connect().
        base.Connect();
    }
}

public class Derived2: Derived {
    public override void Connect() {
        //here just make a call to CallBaseConnnect() in base class Derived1
        //that 'll equivalent to base.base.Connect.
        base.CallBaseConnnect();
    }
}
于 2013-06-19T16:40:05.290 に答える