Пример использования: я использую шаблоны данных для сопоставления представления с моделью представления. Шаблоны данных работают, проверяя наиболее производный тип предоставленного конкретного типа, и они не смотрят, какие интерфейсы он предоставляет, поэтому мне приходится делать это без интерфейсов.
Я упрощаю пример здесь и опускаю 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? Если да, то как лучше это сделать?