¿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?