使用场景:我正在使用数据模板将视图与视图模型匹配。 数据模板通过检查提供的具体类型的最派生类型来工作,它们不会看它提供了哪些接口,因此我必须在没有接口的情况下进行操作。
这里简化了示例并省略了NotifyPropertyChanged等内容,但在现实世界中,视图将绑定到Text属性。 为简单起见,想象一下一个带有TextBlock的视图将绑定到ReadOnlyText,而带有TextBox的视图将绑定到WritableText。
这里简化了示例并省略了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?如果是这样,有更好的方法吗?
通过重写OnTextSet并改变其行为,是否违反了{{LSP}}?如果是,有更好的方法吗?