为什么福勒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