我刚刚安装了微软代码合同。它是.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