【发布时间】:2018-06-27 23:51:26
【问题描述】:
我正在详细了解 LSP,我确实明白为什么强化前置条件会违反原则(使用来自 http://www.ckode.dk/programming/solid-principles-part-3-liskovs-substitution-principle/#contravariance 的示例):
public class SuperType
{
public virtual string FormatName(string name)
{
if (string.IsNullOrEmpty(name))
throw new ArgumentException("name cannot be null or empty", "name");
return name;
}
}
//VIOLATING ONE
public class LSPIllegalSubType : SuperType
{
public override string FormatName(string name)
{
if (string.IsNullOrEmpty(name) || name.Length < 4)
throw new ArgumentException("name must be at least 4 characters long", "name");
return name;
}
}
在这里,我清楚地看到,对于基类有效的东西对于它的派生类会失败。换句话说,我不能在不改变行为的情况下用它的派生类替换基类。
现在以下方法被认为是合法的,因为它削弱了先决条件:
public class LSPLegalSubType : SuperType
{
public override string FormatName(string name)
{
if (name == null)
throw new ArgumentNullException("name");
return name;
}
}
引用网站:这是完全合法的,因为超类型的任何有效参数在子类型中也有效。
好吧,但是无效的参数呢?如果我有一个使用无效参数(例如空名称)调用 SuperType 的代码,它将失败。如果我将其替换为子类型,则相同的调用不会失败,因为条件较弱。所以从这个意义上说,我不能用子类型替换超类型,因为它也会改变行为。我很困惑。
【问题讨论】:
-
你的第二个例子强化了前提条件。
-
啊,对不起,错误的代码 sn-p!你是对的
标签: oop solid-principles liskov-substitution-principle