web-dev-qa-db-ja.com

仮想メソッドがオーバーライドまたは同様の何かから呼び出されるように強制するC#設計

次のようなことができます:

// in base class
protected virtual void Init(){
   //do stuff that all objects need to do
}

//in derived class
protected override void Init(){
   base.Init(); // if you forget this but it compiles all hell breaks loose
   //do derived stuff related to this object
}

基本のinit呼び出しを忘れただけだったので、論理エラーで15分間過ごしました。

しかし、派生メソッドに基本同等物を呼び出すように「要求する」または契約で強制するキーワードはありません。ですから、忘れてしまうと、ベースを呼び出す必要があるいくつかのケースで悪い時間を過ごすことになります。または、baseを呼び出し、派生クラスがそれらの一部ではなくすべての基本値をオーバーライドするため、必要がない場合もあります。

このような物忘れが発生しないように、これをより堅牢/厳密にする方法はありますか?.

4
WDUK

なぜなら、空のオーバーライド可能オブジェクトの標準パターンによって同じ効果がすでに達成されているからです。

封印されていないすべてのメソッドの本文が空の場合、オーバーライドされたメソッドから呼び出されても問題ありません。メソッドテンプレートパターンを使用して実装をシールし、空のメソッドのみをオーバーライド用に公開します。

public sealed override void callMe() {
     before();
     overrideMe();
     after();
}

protected virtual void overrideMe() {
   // left empty to be optionally implemented in children
}

必須の呼び出しでメソッドをシールすると、実装者はそれらを回避することができなくなります。

10
Basilevs