利斯科夫替换原理与虚法.

本文关键字:替换 | 更新日期: 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)

恕我直言