私が知っている言語は、オーバーライドされたメソッドの呼び出しを強制しません。実際、一部の言語では、オーバーライドできないメソッドをオーバーライドできます(new
C#でキーワードを使用するなど)。ただし、これにアプローチする方法は2つあります。
1つ目は、クラス外(C#、Java、C ++など)から呼び出すことができないオーバーライド可能なメソッドを呼び出す、オーバーライドできないメソッド(virtual
C#のキーワードを持たないメソッドやfinal
Java のキーワードを持つメソッドなど)を作成することprotected
です。
class C
A
statement1
F
statement3
protected virtual F
statement2
そして
class D inherits C
protected override F
statement4
C.F()
オーバーライドC
するクラスは、自由にオーバーライドしてF
その動作を変更できますが、クラスの外部からの呼び出し元はを介してのみアクセスしますA
。
編集:他の人が指摘したように、これはテンプレートメソッドパターンと呼ばれます。
2番目の方法は、EiffelやC#with Code Contractsなど、基本クラスで指定された前提条件と事後条件を強制する言語を使用することです。基本クラスが強制的に呼び出されることはありませんが、オーバーライドされたメソッドは同じステートメントを強制的に実行できます。言語がアスペクトの継承を許可している場合、アスペクトの使用も役立ちます。