为什么Fowler PoEAA p. 498以下列方式定义空对象模式(示例缩短,语言为c#但无关紧要): public class Customer{ public virtual string Name {get; set;}}public class NullCustomer : Customer, INull{ public override Name { g
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;} }
我一般都认为所有福勒的例子都经过深思熟虑,显然我必须在这里错过一些东西.
继承的原因是覆盖类的行为.你在考虑它的方式在我看来就像你要检查你所拥有的对象是否等于NullCustomer静态实例来做出决定,但是null对象的要点是支持 Liskov’s substitution principle.换句话说,您使用null对象来设置引用,并且您将不会对其进行特殊检查,您将只使用它并且它应该具有不同的行为(实际上缺乏行为).