Liskov替换原理 - 重写方法示例

时间:2011-12-21 02:46:12

标签: liskov-substitution-principle

让我们说我们有这个非常微不足道的课程:

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;
    }
}

据我所知,使用变量“variable”会导致更强的前置条件,因此它违反了LSP。但是我不完全确定在使用多态时如何遵循LSP。

2 个答案:

答案 0 :(得分:2)

这是有效的,在这两种情况下它都没有违反原则。 B可以代替A.它只是具有不同的功能。

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

答案 1 :(得分:0)

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

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

如果要将对B对象的引用传递给Foo,则断言将失败。 B.Function正在改变A.Function的后置条件。 Foo客户端代码不应该知道可能破坏其代码的可能的子类型。