2012-07-12 142 views
2

Best Practices建议将新方法设置为受保护,并使用static new ...方法来减轻方法重载的不足。
所以我用这个模式解释如下here静态新建和继承

但是静态方法不会被继承。 所以我们必须为每个子类定义静态构造和静态新...方法。
因此,我们失去了一些继承的好处。

我对系统类来看看,希望能找到一个更好的解决办法,但我所看到的并没有真正帮助我:
- 一些关于静态的新模式,并宣布在子类中的方法
- 有的只是用实例新的不保护它
- 一些使用母类为“类工厂”,像SalesFormLetter

static SalesFormLetter construct(DocumentStatus document, 
            boolean   getParmId = true) 
    { 
    switch(document) 
    { 
     case DocumentStatus::Confirmation  : return new SalesFormLetter_Confirm   (getParmId); 
     case DocumentStatus::PickingList  : return SalesFormLetter_PickingList::construct(getParmId); 
     case DocumentStatus::PackingSlip  : return new SalesFormLetter_PackingSlip  (getParmId); 
     case DocumentStatus::ProjectPackingSlip : return new SalesFormLetter_PackingSlipProject(getParmId); 
     case DocumentStatus::Invoice   : return new SalesFormLetter_Invoice   (getParmId); 
     case DocumentStatus::ProjectInvoice  : return new SalesFormLetter_InvoiceProject (getParmId); 

     default : throw error(strfmt("@SYS19306",funcname())); 
    } 

    throw error(strfmt("@SYS19306",funcname())); 
} 

所以我想知道是否有更好的解决办法,如果没有什么是名列前茅这些?

回答

2

对象构造的更好解决方案?

那么,new必须去的地方,并在客户端代码很多new是脆弱和僵化。因此,特别是与相关课程的“工厂”类一起去吧。

两个选项:

  1. new保护。为每个子类创建一个构造,将工厂构造放入调用子类构造函数的基类中。但是任何人都可以调用子类构造方法。

  2. 使new公开。不要为每个子类创建一个构造,将该构造放到基类中,创建子类。由于基类不会从子类中下来,所以新不能被保护。

无论你是否选择1或2是你的选择,你最终会暴露子类的构造函数。我个人更喜欢选项2,因为它是最简单的。

建议:使用参数new明确你的对象依赖关系。这会使你的工厂变得复杂,但这是可以的,因为它将复杂性从你的客户代码中移走。安装人员方法(parm方法)是邪恶的,但RunBase需要,因为它是批处理系统所必需的。

另外去看看什么Uncle Bob写道。

+0

感谢您的回答。 我想我需要一些时间才能完全理解并付诸实践。 – Pierre 2012-07-12 13:27:02