1

追加の前提条件を使用して派生クラスで仮想関数がオーバーライドされるシナリオがあります。ここにスナップショットがあります -

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 に固有であるため、基本型に移動できません。

このような場合、派生クラスが動作をオーバーライドし、リスコフの原則を破ることなく独自の動作を置き換えたい場合、オーバーライドされた動作を実現する最善の方法は何でしたか?

4

2 に答える 2

0

Henk Holterman が言うように、LSP には違反していません。事後条件を強化し、前提条件を弱めないでOK。

したがって、次の呼び出しによって基本クラスが行うことを行います。

base.ValidateDates();

いくつかの事後条件を追加します (事後条件を強化しました):

if (IsImmediateProcess)

私見では

于 2013-10-27T12:19:16.220 に答える