Нарушает ли это принцип подстановки Лискова, и если да, то что мне с этим делать?

Вариант использования: я использую шаблоны данных, чтобы сопоставить View с ViewModel. Шаблоны данных работают путем проверки наиболее производного типа конкретного предоставленного типа, и они не смотрят, какие интерфейсы он предоставляет, поэтому я должен сделать это без интерфейсов.

Я упрощаю пример и оставляю NotifyPropertyChanged и т. Д., Но в реальном мире представление будет привязываться к свойству Text. Для простоты представьте, что представление с TextBlock связывается с ReadOnlyText, а представление с TextBox связывается с WritableText.

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);
    }
}

Переопределяя OnTextSet и меняя его поведение, я нарушаюLSP? Если это так, что может быть лучше?

Ответы на вопрос(1)

Ваш ответ на вопрос