1

我有一个场景,其中一个虚拟函数在派生类中被附加的前置条件覆盖。这是快照-

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 原则的情况下,派生类会覆盖行为并希望替换自己的行为,如果在这种情况下这样做,那么在这种情况下实现被覆盖行为的最佳方法可能是什么?

4

2 回答 2

2

假设你的意思class InitialProcess : Process

这完全符合 Liskov 原则。

两个类具有相同的接口但不同的(扩展)行为。派生类没有不同的前置条件,它有不同的验证规则。这很好,不会破坏任何东西。

于 2013-10-08T07:32:30.333 回答
0

正如 Henk Holterman 所说,它不违反 LSP。是加强后置条件,不削弱前置条件,就可以了。

所以,它通过调用来完成基类所做的事情:

base.ValidateDates();

并添加一些后置条件(加强后置条件):

if (IsImmediateProcess)

恕我直言

于 2013-10-27T12:19:16.220 回答