4

エッフェルでは「前提条件を緩め、事後条件を厳しくする」と言われていますが、どういう意味かわかりません。これは、サブクラス化によってどのようにメリットがありますか?

ありがとうございました

4

1 に答える 1

7

契約による設計では、関数の一連の事前条件と一連の事後条件を指定します。たとえば、メモリ割り当て関数を作成しているとします。入力として正の整数を受け入れ、その結果として均等に整列されたポインターを生成する必要があります。

前提条件を緩めると、派生クラスを作成するときに、基本クラスが受け入れることができるすべての入力を受け入れる必要がありますが、他の入力も受け入れる可能性があります。上記の例を使用すると、正の整数だけでなく、負でない整数を受け入れるように派生クラスを作成できます。

結果側では、派生関数からの結果が基本関数に課せられたすべての要件を満たしていることを確認する必要がありますが、さらに制限を追加することもできます。たとえば、上記の関数の派生バージョンは、8の倍数の結果のみを生成することを決定できます。8の倍数はすべて明らかに偶数であるため、基本関数の要件を満たしていますが、追加の制限も課されています。

逆は機能しません。基本クラス関数が非負の整数を入力として許可する場合、派生クラスはすべての非負の整数を入力として受け入れ続ける必要があります。正の整数のみを受け入れるように変更しようとすること(つまり、基本クラスで許可されている0を拒否すること)は許可されません。派生クラスは、すべての状況で基本バージョンの代わりに使用できなくなります。

結果と同様に、基本クラスが結果に「8の倍数」要件を課した場合、派生バージョンは、すべての結果が8の倍数であることも確認する必要があります。2または4を返すと、その要件に違反します。

于 2010-09-10T04:52:10.690 に答える