C# では - ただし、他の言語にも適用できる可能性があります - LSPのコンテキストでは、別の (変更可能な) クラスから継承するクラスが元の契約を破らないようにするにはどうすればよいですか?
例:またはプロパティ セッターがある場合public
、クラスを継承すると元のコントラクトが壊れるリスクがあります。同じことがメソッドにも当てはまります。internal
protected
virtual
これは、親クラスと継承クラスの所有者が同一人物でない場合に特に当てはまります。コントラクトおよび元の開発者の意図に知識が不足している可能性があるためです。
不変性は唯一の解決策ですか、それとも他の方法がありますか? 私は、継承は「is a」関係ではなく「behaves like a」関係に対応すると考える傾向があります。それは正しい論理的保護ですか?
説明のための例を次に示します。
public class Foo
{
public virtual void DummyMethod(int dummyParameter)
{
if (dummyParameter > 10) { throw new ArgumentOutOfRangeException(); }
}
}
public class Bar : Foo
{
public override void DummyMethod(int dummyParameter)
{
if (dummyParameter < 0) { throw new InvalidOperationException(); }
}
}
このトピックを扱っている他の質問に気付きました (たとえば、こちら) が、これらの問題を前もって直面することを避けるために適用する一般的な解決策または適切な方法を探しています。