¿Esto viola el principio de sustitución de Liskov y, de ser así, qué debo hacer al respecto?

Caso de uso: estoy usando plantillas de datos para hacer coincidir una vista con un modelo de vista. Las plantillas de datos funcionan inspeccionando el tipo más derivado del tipo concreto proporcionado, y no miran qué interfaces proporciona, por lo que tengo que hacer esto sin interfaces.

Estoy simplificando el ejemplo aquí y dejando de lado NotifyPropertyChanged, etc., pero en el mundo real, una vista se unirá a la propiedad Text. Para simplificar, imagine que una Vista con TextBlock se uniría a un ReadOnlyText y una Vista con un TextBox se uniría a 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);
    }
}

Al anular OnTextSet y cambiar su comportamiento, ¿estoy violando elLSP? Si es así, ¿cuál es una mejor manera de hacerlo?

Respuestas a la pregunta(4)

Su respuesta a la pregunta