erstößt dies gegen das Liskov-Substitutionsprinzip und wenn ja, was mache ich dagege

Use case: Ich verwende Datenvorlagen, um eine Ansicht mit einem ViewModel abzugleichen. Datenvorlagen untersuchen den am besten abgeleiteten Typ des bereitgestellten konkreten Typs, und sie untersuchen nicht, welche Schnittstellen er bereitstellt. Daher muss ich dies ohne Schnittstellen tun.

Ich vereinfache das Beispiel hier und lasse NotifyPropertyChanged usw. weg, aber in der realen Welt wird eine View an die Text-Eigenschaft gebunden. Stellen Sie sich der Einfachheit halber vor, eine Ansicht mit einem TextBlock würde an einen ReadOnlyText und eine Ansicht mit einer TextBox an WritableText gebunden.

class ReadOnlyText
{
    private string text = string.Empty;

    public string Text
    {
        get { return text; }
        set
        {
            OnTextSet(value);
        }
    }

    protected virtual void OnTextSet(string value)
    {
        throw new InvalidOperationException("Text is readonly.");
    }

    protected void SetText(string value)
    {
        text = value;
        // in reality we'd NotifyPropertyChanged in here
    }
}

class WritableText : ReadOnlyText
{
    protected override void OnTextSet(string value)
    {
        // call out to business logic here, validation, etc.
        SetText(value);
    }
}

enn ich OnTextSet überschreibe und sein Verhalten ändere, verstoße ich gegen das LSP? Wenn ja, wie geht das besser?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage