5

この本当に些細なクラスがあるとしましょう:

class A
{
    virtual int Function(int number)
    {
      return number;
    }
}

class B : A
{
    override int Function(int number)
    {
        return number + 1;
    }
}

class UseExample
{
    void Foo(A obj)
    {
        A.Function(1);
    }
}

この例は LSP に違反しますか? もしそうなら、原則を破らず、別の実装を使用する例を教えてください。

これはどうですか:

class B : A
{
    int variable;

    override int Function(int number)
    {
        return number + variable;
    }
}

私が理解している限り、変数「変数」を使用すると、より強力な前提条件が発生するため、LSP に違反します。しかし、ポリモーフィズムを使用するときに LSP に従う方法が完全にはわかりません。

4

2 に答える 2

2

それは有効です。どちらの場合も、原則を破ることはありません。B は A の代わりに使用できます。機能が異なるだけです。

コントラクトを破る簡単な方法は、数値 == 23 または何かの場合に Bs オーバーライドで例外をスローすることです:)

于 2011-12-21T02:49:49.813 に答える