首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fowler对象模式:为什么使用继承?

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

Stack Overflow用户
提问于 2009-11-10 17:42:14
回答 4查看 2.1K关注 0票数 4

Fowler PoEAA p. 498为什么以以下方式定义空对象模式(示例缩短,语言是c#,但并不重要):

代码语言:javascript
复制
public class Customer
{
  public virtual string Name {get; set;}
}

public class NullCustomer : Customer, INull
{
  public override Name 
  {
     get { return "ImTheNull";}
     // setter ommitted
  }
}

INull用作标记接口。我不太喜欢这种方法,原因有三:

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

为什么它不像这样实现:

代码语言:javascript
复制
public class Customer
{
  public static readonly Customer NullCustomer = new Customer(){Name = "ImtTheNullCustomer";}

  public string Name {get; set;}
}

我发现所有的Fowler的例子都经过了很好的思考,很明显我在这里错过了一些东西。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-10 18:06:49

继承的原因是重写类的行为。在我看来,您的思考方式似乎是要检查您拥有的对象是否等于NullCustomer静态实例来作出决定,但是null对象的要点是维护Liskov代换原理

换句话说,您使用null对象来设置引用,您将不会对它进行特殊检查,您将只使用它,它应该有一个不同的行为(实际上是缺少行为)。

票数 10
EN

Stack Overflow用户

发布于 2009-11-10 18:06:16

第二个例子的问题是,如果您的类有属于该类的其他项,则现在必须插入针对魔术的检查,以决定返回信息或其他适当的信息。

对于Null类,类返回最有意义的内容,而不需要这样的检查。

例如,customer类可能在适当询问DB之后返回该用户花费的美元总额。一个NullCustomer就可以return 0;了。使用神奇的值,它将从DB中获取虚拟用户的信息,或者在执行明智的操作之前必须运行另一个特定的检查。

票数 1
EN

Stack Overflow用户

发布于 2009-11-10 18:16:40

再加上他说的话。使用Null对象模式,以便有一组可以接受的缺省值。此外,如果您试图在MVC中使用NullCustomer,您仍然可以访问表示模型的对象,而不必考虑潜在的不存在的数据。检查空值

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1709816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档