使用案例:我正在使用數據模板將視圖與ViewModel進行匹配。數據模板通過檢查所提供的具體類型的最派生類型來工作,並且它們不查看它提供的接口,所以我必須在沒有接口的情況下執行此操作。這是違反Liskov替代原則嗎?如果是這樣,我該怎麼辦?
我在這裏簡化了這個例子,而忽略了NotifyPropertyChanged等,但在現實世界中,一個View將綁定到Text屬性。爲了簡單起見,假設帶有TextBlock的視圖將綁定到ReadOnlyText,並且帶有TextBox的View將綁定到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?如果是這樣,有什麼更好的方法來做到這一點?
http://en.wikipedia.org/wiki/Liskov_substitution_principle(對於那些還沒有喝過咖啡的人) – 2010-10-22 12:41:20
@SomeMiscGuy:對不起,添加鏈接:) – 2010-10-22 12:42:49
順便說一下,有可能解決一個基於數據模板在實現接口的類上使用DataTemplateSelector。這對我來說效果很好:http://complexdatatemplates.codeplex.com/ – 2010-10-22 13:11:36