0

C# では - ただし、他の言語にも適用できる可能性があります - LSPのコンテキストでは、別の (変更可能な) クラスから継承するクラスが元の契約を破らないようにするにはどうすればよいですか?

例:またはプロパティ セッターがある場合public、クラスを継承すると元のコントラクトが壊れるリスクがあります。同じことがメソッドにも当てはまります。internalprotectedvirtual

これは、親クラスと継承クラスの所有者が同一人物でない場合に特に当てはまります。コントラクトおよび元の開発者の意図に知識が不足している可能性があるためです。

不変性は唯一の解決策ですか、それとも他の方法がありますか? 私は、継承は「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(); }
    }
}

このトピックを扱っている他の質問に気付きました (たとえば、こちら) が、これらの問題を前もって直面することを避けるために適用する一般的な解決策または適切な方法を探しています。

4

1 に答える 1

1

sealedキーワードを使用すると、LSP の違反を防ぐことができます。

これは、このクラスからまったく継承できないことを意味するため、LSP に違反するリスクを排除するか、継承および変更の自由を排除するか、どちらを優先するかを決定する必要があります。

コメントで封印された最初の言及については、@Hans Passant の功績によるものです。

于 2012-09-20T15:00:27.587 に答える