我有一个场景,其中一个虚拟函数在派生类中被附加的前置条件覆盖。这是快照-
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");
}
}
}
}
如果我理解正确,这里的代码通过施加额外的前提条件来打破 Liskov 替换 - IsImmediateProcess 和其他日期检查。这是对的吗?或者一个被覆盖的函数调用一个基函数然后添加它自己的行为是否可以?
我无法将重写方法中 InitialProcess 类型引入的条件移动到基本类型,因为它特定于 InitialProcess。
在这种情况下,在不违反 Liskov 原则的情况下,派生类会覆盖行为并希望替换自己的行为,如果在这种情况下这样做,那么在这种情况下实现被覆盖行为的最佳方法可能是什么?