現在、コード コントラクトでは、メンバーが基本クラスで既に前提条件が設定されている派生クラスのメンバーの前提条件を許可していません (現在、エラーではなく警告が表示されます)。この背後にあるロジックがわかりません。派生クラスは、親が期待される場所で常に使用できるようにする必要があるという Liskov の置換規則に関係していることを理解しています。もちろん、「使用済み」とは、期待どおりに動作することを意味します。インターフェイスを実装するさまざまなタイプは状態を追加しないため、契約を正確に義務付けることができるため、これはインターフェイスにとって問題ないように思えます。ただし、基本クラスから継承する場合は、状態と特別な機能を追加するためにそうしているため、オーバーライドするメソッドには追加の要件が必要になることがよくあります。どうして」
以下をご覧ください。
class Speaker
{
public bool IsPlugged { get; set; }
protected virtual void Beep()
{
Contract.Requires(IsPlugged);
Console.WriteLine("Beep");
}
}
class WirelessSpeaker : Speaker
{
public bool TransmitterIsOn { get; set; }
protected override void Beep()
{
Contract.Requires(TransmitterIsOn);
base.Beep();
}
}
このクラス階層はリスコフのルールに違反していると主張するかもしれませんSpeaker
. しかし、それがコード コントラクトを使用する理由ではありませんか? 要件が満たされていることを確認するには?