我剛剛安裝了微軟代碼合同。它是.NET Framework和Visual Studio插件的一部分。它提供運行時檢查和定義合同的靜態檢查。是否有可能在構造函數中違反Liskov替換原則?
該工具有四個警告級別,所以我設置了最高。
我已經宣佈設計違反Liskov替代原則的類。
public class Person
{
protected int Age { get; set; }
public Person(int age)
{
Contract.Requires(age > 0);
Contract.Requires(age < 130);
this.Age = age;
}
}
public class Child : Person
{
public Child(int age) : base(age)
{
Contract.Requires(age > 0);
Contract.Requires(age < Consts.AgeOfMajority);
Contract.Requires(age < 130);
this.Age = age;
}
}
public static class Consts
{
public readonly static int AgeOfMajority = 18;
}
LSP規定:
如果S是T的子類型,則類型T的對象可以與S型的 對象替換,而不改變任何編程
的 所需性質的
在我的例子中,違規行爲是:Person person = new Child(23);
。我們應該可以做到這一點,但是我們不能這樣做,因爲孩子的年齡不會比年齡小於人類年齡所要求的年齡。
然而,分析結果令人驚訝CodeContracts: Checked 11 assertions: 11 correct
。我的例子是錯誤的還是代碼合同沒有檢測到這樣的事情?
我不認爲這違反了LSP。你的課沒有行爲,他們有相同的api。唯一的區別是他們的建築規則不同,但我從客戶使用這個班級的角度來解釋LSP的方式。任何處理「人物」的人都不應該知道關於兒童最大年齡的規則。在這種情況下,他們不需要。 – kai
請注意,制定者不受限制。解決這個問題,你應該得到一個錯誤。 – Kevin
@Kevin我已經實現了全年齡屬性並添加了需要的語句。仍然沒有警告。 – Landeeyo