3

最佳实践建议将新方法设置为受保护,并改用静态新... 方法来减轻方法重载的不足。所以我使用这里
解释的这种模式

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

我查看了系统类,希望找到更好的解决方案,但我所看到的并没有真正帮助我:
-有些尊重静态新模式并在子类中声明方法
-有些只是使用实例 new 而没有保护它
-有些将母类用作“类工厂”,例如 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()));
}

所以我想知道是否有更好的解决方案,如果没有,其中最好的解决方案是什么?

4

1 回答 1

3

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

好吧,new必须去某个地方,并且new在客户端代码中放很多东西是脆弱且不灵活的。因此,请使用“工厂”类,尤其是相关类。

两种选择:

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

  2. new公开。不要为每个子类创建一个构造,将构造放在基类中,新建子类。新的不能被保护,因为基类不是子类的后代。

无论您选择 1 还是 2 都是您的选择,您最终都会暴露子类构造函数。我个人更喜欢选项 2,因为它最省事。

建议:使用new. 这将使您的工厂复杂化,但这没关系,因为它可以将复杂性从您的客户端代码中移开。Setter 方法(parm方法)是邪恶的,但RunBase它是必需的,因为它是批处理系统所需要的。

也去看看鲍勃叔叔写了什么。

于 2012-07-12T10:44:46.133 回答