Fowler Null对象模式:为什么要使用继承?

Joh*_*lph 4 design-patterns null-object-pattern poeaa

为什么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
  }
}
Run Code Online (Sandbox Code Playgroud)

INull用作标记界面.我不喜欢这种方法有三个原因:

  1. 属性需要标记为虚拟
  2. 我不能再密封我的实体课了
  3. 引入至少(n + 1)个新类型(n个空对象,一个标记接口)

为什么不像这样实现:

public class Customer
{
  public static readonly Customer NullCustomer = new Customer(){Name = "ImtTheNullCustomer";}

  public string Name {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我一般都认为福勒的所有例子都经过深思熟虑,显然我必须在这里找到一些东西.

Cha*_*hap 10

继承的原因是覆盖类的行为.你在考虑它的方式在我看来就像你要检查你所拥有的对象是否等于NullCustomer静态实例来做出决定,但是null对象的要点是坚持Liskov的替换原则.

换句话说,您使用null对象来设置引用,并且您将不会对其进行特殊检查,您将只使用它并且它应该具有不同的行为(实际上缺乏行为).