比方说,我们有这个真是小巫见大巫类:里氏替换原则 - 压倒一切的方法例如
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。
因为你的函数没有任何合同,所以返回任意值的实现是完全可以接受的。但是,如果您在函数名称中指定了一个合约,则会进入灰色区域,如下所示:int Add1ToArgument(int argument){...} – Polity 2011-12-21 02:53:46
Polity,方法命名中隐含的语义并不真正进入它。它来自类型定义。 – 2011-12-21 02:55:44
如果语义与原理无关,你会介意给我解释一下Rectangle/Square的例子吗?市长抱怨说,我发现迄今为止,如果您使用Rectangle obj = new Square()并且在未事先知道该对象是Square的情况下分配高度宽度,则会得到函数getArea的意外结果()只是因为你认为一个Rectangle对于Height和Width有两个不同的值。在此先感谢 – BizTuk 2011-12-21 03:07:22