为什么 Fowler PoEAA p。498 以以下方式定义空对象模式(示例缩短,语言是 c# 但没关系):
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 的例子都经过深思熟虑,显然我在这里遗漏了一些东西。