Isso viola o princípio da substituição de Liskov e, em caso afirmativo, o que devo fazer?
Caso de uso: estou usando modelos de dados para corresponder uma View a um ViewModel. Os modelos de dados funcionam inspecionando o tipo mais derivado do tipo concreto fornecido, e eles não olham para quais interfaces ele fornece, então eu tenho que fazer isso sem interfaces.
Estou simplificando o exemplo aqui e deixando de fora NotifyPropertyChanged, etc., mas no mundo real, um View será vinculado à propriedade Text. Por uma questão de simplicidade, imagine que uma View com um TextBlock se vincule a um ReadOnlyText e uma View com um TextBox se vincule 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);
}
}
Ao substituir o OnTextSet e alterar seu comportamento, estou violando oLSP? Se sim, qual é a melhor maneira de fazer isso?