Liskov替换原则(LSP)认为:
子类型中的前置条件不能被加强。
在C#中,我可以如下违反整个原则:
public class A
{
public virtual void DoStuff(string text)
{
Contract.Requires(!string.IsNullOrEmpty(text));
}
}
public class B : A
{
public override void DoStuff(string text)
{
Contract.Requires(!string.IsNullOrEmpty(text) && text.Length > 10);
}
}
但是,如果A.DoStuff
是一个抽象方法
,会发生什么:
public class A
{
public abstract void DoStuff(string text);
}
public class B : A
{
public override void DoStuff(string text)
{
Contract.Requires(!string.IsNullOrEmpty(text));
}
}
现在,
A.DoStuff
是没有契约的。或者说它的契约只是允许一切。那么,
B.DoStuff
违反了Liskov替换原则的前提条件吗?