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。它只是具有不同的功能。

打破合同的一种简单方法是在 Bs 覆盖中抛出异常,如果数字 == 23 或其他东西:)

于 2011-12-21T02:49:49.813 回答
0

根据我对它的理解,我会说你的两个例子都违反了 LSP,因为子类不能被它的超类取代。考虑以下:

class UseExample {
    void Foo(A& obj, int number) {
        int retNumber = obj.Function(number);
        assert(retNumber==number);
    }
}

如果您将对 B 对象的引用传递给 Foo ,则断言将失败。B.Function 正在改变 A.Function 的 poscondition。Foo 客户端代码不必知道可能会破坏其代码的子类型。

于 2014-02-05T18:17:15.010 回答