C# Liskov代换原理与虚方法

C# Liskov代换原理与虚方法,c#,oop,solid-principles,design-principles,C#,Oop,Solid Principles,Design Principles,我有一个场景,其中一个虚拟函数在派生类中被重写,并带有附加的前置条件。这是快照- class Process { protected virtual void ValidateDates() { if (Entity.StartDate.Date > Entity.EndDate.Date) { AddFailure("Start date cannot be later than the End date");

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

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原则的情况下替换自己的行为,那么在这种情况下实现重写行为的最佳方法是什么?

假设您的意思是
类InitialProcess:Process

这完全符合利斯科夫原理


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

正如亨克·霍特曼所说,这并不违反LSP。是强化了后条件,而不是削弱了先决条件,这是可以的

因此,它执行基类通过调用执行的操作:

base.ValidateDates();
并增加一些岗位条件(强化岗位条件):


IMHO

这是否意味着添加这样的内容会是受冲突保护的覆盖void ValidateDates(){if(IsImmediateProcess){base.ValidateDates();if(Entity.StartDate.Date>CurrentDateTime.Date){AddFailure(“开始日期不能晚于当前日期”);}@vibhu-难以阅读,看起来与问题中的一样。看不到任何违规行为。我甚至不确定subst原则是否适用于受保护的成员。我不适合LSP,但前提条件是否在这里得到了加强,从而导致违规行为发生?@Henk-我无法在注释中编辑代码,但我只是在I中调用了base.ValidateDates方法请进行过程检查,以确保我完全得到您的答案。我想我现在理解得很好。谢谢。
if (IsImmediateProcess)