爲什麼福勒PoEAA p。 498定義以下面的方式在空物體圖案(樣品縮短,語言是C#,但沒關係):Fowler空對象模式:爲什麼使用繼承?
public class Customer
{
public virtual string Name {get; set;}
}
public class NullCustomer : Customer, INull
{
public override Name
{
get { return "ImTheNull";}
// setter ommitted
}
}
INull
被用作一個標記接口。 我真的不喜歡這種方法的原因有三:
- 屬性需要標記虛擬
- 我不能封我的實體類了
- 至少(N + 1)的新類型介紹(N空對象,一個標記接口)
爲什麼不是實現這樣的:
public class Customer
{
public static readonly Customer NullCustomer = new Customer(){Name = "ImtTheNullCustomer";}
public string Name {get; set;}
}
我一般都會發現所有Fowlers的例子都很好想,顯然必須有一些我在這裏錯過的東西。
請勿使虛擬方法變爲虛方法,或者因爲這個原因讓類不啓動。雖然我非常尊重Martin Fowler,但他的許多涉及繼承的例子都存在明確的Java偏見。在Java方法中默認是虛擬的。在C#中,他們不是,並且設計決定是由於默認虛擬方法的問題而產生的。無論如何,如果NullCustomer將成爲有效的客戶,請使用此模式。一個很好的指標是將其與空列表進行比較。一個空的列表是一個非常好的列表,宣傳它並沒有什麼壞處。這可能不是這種情況。 – 2016-06-26 06:21:39