次のようなことができます:
// 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を呼び出し、派生クラスがそれらの一部ではなくすべての基本値をオーバーライドするため、必要がない場合もあります。
このような物忘れが発生しないように、これをより堅牢/厳密にする方法はありますか?.
なぜなら、空のオーバーライド可能オブジェクトの標準パターンによって同じ効果がすでに達成されているからです。
封印されていないすべてのメソッドの本文が空の場合、オーバーライドされたメソッドから呼び出されても問題ありません。メソッドテンプレートパターンを使用して実装をシールし、空のメソッドのみをオーバーライド用に公開します。
public sealed override void callMe() {
before();
overrideMe();
after();
}
protected virtual void overrideMe() {
// left empty to be optionally implemented in children
}
必須の呼び出しでメソッドをシールすると、実装者はそれらを回避することができなくなります。