让我们说我们有这个非常微不足道的课程:
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。
答案 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客户端代码不应该知道可能破坏其代码的可能的子类型。