里氏替换原理(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
将是一个abstract
method:
public class A
{
public abstract void DoStuff(string text);
}
public class B : A
{
public override void DoStuff(string text)
{
Contract.Requires(!string.IsNullOrEmpty(text));
}
}
Now A.DoStuff
is 无合约的。或者它的合同只是一切都允许.
So, is B.DoStuff
违反先决条件里氏替换原则?
这取决于合同的定义是什么.
LSP 是一个理论构造,它不依赖于特定的语言或实现,例如 C# 的“代码契约”功能。
合约可以定义为:
- 方法名称
- 方法参数名称
- 方法注释
- 返回类型和方法参数类型
- “显式”合同,例如
Contract.Requires
最后两项将由编译器验证。但是,前三个也可以成为合同的一部分!考虑以下示例:
public interface StuffContainer
{
void Add(string text);
// Removes a string that has previously been added.
void Remove(string text);
}
名称和文件Remove
方法定义了明确的前提条件。在实现中验证之前已添加的要删除的字符串不会违反 LSP。验证字符串是否至少有 5 个字符将违反 LSP。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)