比方說,我們有這個真是小巫見大巫類:里氏替換原則 - 壓倒一切的方法例如
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