追加の前提条件を使用して派生クラスで仮想関数がオーバーライドされるシナリオがあります。ここにスナップショットがあります -
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 に固有であるため、基本型に移動できません。
このような場合、派生クラスが動作をオーバーライドし、リスコフの原則を破ることなく独自の動作を置き換えたい場合、オーバーライドされた動作を実現する最善の方法は何でしたか?