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)