利斯科夫替换原理与虚法.
本文关键字:替换 | 更新日期: 2023-09-27 18:34:32
我有这样的情况:在派生类中用额外的前提条件覆盖虚函数。这是快照 -
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 替换。正确吗?或者被覆盖的函数调用基函数然后向其添加自己的行为是否可以?
我无法将重写方法中的初始流程类型引入的条件移动到基类型,因为它特定于初始过程。
在这种情况下,派生类重写行为并希望替换自己的行为而不破坏 Liskov 原则,如果它像在这种情况下那样这样做,那么实现重写行为的最佳方法是什么?
假设你的意思是class InitialProcess : Process
这完全遵循了利斯科夫原则。
这两个类具有相同的接口,但具有不同的(扩展(行为。派生类没有不同的前提条件,它具有不同的验证规则。这很好,不会破坏任何东西。
正如Henk Holterman所说,它不违反LSP。是强化后置条件,不弱后置条件,哪个还行。
因此,它通过调用来执行基类所做的事情:
base.ValidateDates();
并增加一些后置条件(加强后置条件(:
if (IsImmediateProcess)
恕我直言