[英]Liskov substitution Principle and Virtual Method
我有一个方案,其中虚函数在派生类中带有其他前提条件被覆盖。 这是快照-
class Process
{
protected virtual void ValidateDates()
{
if (Entity.StartDate.Date > Entity.EndDate.Date)
{
AddFailure("Start date cannot be later than the End date");
}
}
}
class InitialProcess : Process
{
protected override void ValidateDates()
{
base.ValidateDates();
if (IsImmediateProcess)
{
if (Entity.StartDate.Date > CurrentDateTime.Date)
{
AddFailure("Start date cannot be later than the current date");
}
}
}
}
如果我理解正确,那么这里的代码通过施加一个附加的先决条件-IsImmediateProcess和其他日期检查来破坏Liskov替换。 这是正确的吗? 还是让覆盖的函数调用基本函数然后向其添加自己的行为好吗?
我无法将重写方法中InitialProcess类型引入的条件移动到基本类型,因为它是InitialProcess特有的。
在这种情况下,实现派生类的最佳方法是什么,如果派生类在不违反Liskov原理的情况下覆盖了行为并希望替换其自身的行为(如果在这种情况下这样做的话)?
假设您要class InitialProcess : Process
这恰好遵循里斯科夫原则。
这两个类具有相同的接口,但行为不同(扩展)。 派生类没有不同的前提条件,它具有不同的验证规则。 这是完全可以的,并且不会破坏任何内容。
正如Henk Holterman所说,它不违反LSP。 是加强后置条件,而不是削弱先决条件,这样就可以了。
因此,它通过调用来执行基类的工作:
base.ValidateDates();
并添加一些后置条件(加强了后置条件):
if (IsImmediateProcess)
恕我直言
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.