繁体   English   中英

Liskov替代原理和虚拟方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM