2017-12-11 38 views
0

私はC#アプリケーションを持っています。多くの子クラスを持つ親クラスがあります。私はそれにいくつかのロジックを持つ親クラスのメソッドが欲しいとカスタムロジックが各子クラスによって追加されたので、任意の子クラスがメソッドを呼び出すと、親クラスで定義されたいくつかのコードを実行し、子クラスで定義されているようにカスタマイズされた部分を実行します。これはできますか?そうでない場合、この種のコード実行を達成する最良の方法は何ですか?継承されたロジックとカスタムロジックを継承したC#継承メソッド - これは可能ですか?

+0

を –

+1

あなたは ')(base.Method'も呼び出すことができます子クラスの 'Method()'から削除します。 – itsme86

+0

@ DanielA.Whiteあなたは何を意味するのか説明できますか? – Marathon55

答えて

2

これを達成する方法の1つは、基本クラスで定義されたコードを実行し、次にこのように子クラスがオーバーライドできる(または必要とする)保護されたメソッドを呼び出す非仮想メソッドをエントリポイントとして定義することです。

abstract class Foo 
{ 
    public void Bar() 
    { 
     // some code defined in the parent class 

     BarCore(); // the customized part of it as defined in the child class 
    } 

    protected virtual void BarCore() { } 
} 
3

はい、これは、基本クラスに仮想メソッドを定義し、カスタムロジックを "プラグイン"する必要がある場所で "ペイロード"メソッドから呼び出すことで実行できます。あなたのクラス階層の

abstract class MyBase { 
    protected abstract void CustomLogic(); // Subclasses implement this 
    public void PayloadMethod() { 
     ... // Do somethig 
     CustomLogic(); 
     ... // Do something else 
    } 
} 

class Derived1 : MyBase { 
    protected override void CustomLogic() { 
     ... // Custom logic 1 
    } 
} 

class Derived2 : MyBase { 
    protected override void CustomLogic() { 
     ... // Custom logic 2 
    } 
} 

class Derived3 : MyBase { 
    protected override void CustomLogic() { 
     ... // Custom logic 3 
    } 
} 

クライアントはDerivedNクラスのいずれかをインスタンス化し、その呼び出しの一部としてCustomLogicを呼び出すPayloadMethod()を呼び出します。このメソッドの抽象を行うことが一般的です。

この手法は、Template Method Patternと呼ばれています。

1

これを達成する最も簡単な方法は、二つの方法持っていることです:あなたはなど、デリゲート、抽象メソッドを持つことができ

class BaseClass 
{ 
    public void DoSomething() 
    { 
     // base class code 

     // derived class code, modifiable by the derived class 
     this.DoItSpecificallyForThatDerivedClass(); 
    } 

    protected abstract void DoItSpecificallyForThatDerivedClass(); 
} 

public class ADerivedClass : BaseClass 
{ 
    protected override void DoItSpecificallyForThatDerivedClass() 
    { 
     // code specific to this instance and/or class 
    } 
} 
関連する問題