Axapta 静态新建和继承

Axapta 静态新建和继承,axapta,x++,Axapta,X++,建议将新方法设置为受保护,并使用静态新建。。。减轻方法重载不足的方法。 所以我使用这个模式,正如前面解释的 但是静态方法不是继承的。 所以我们必须为每个子类定义静态构造和静态新。。。方法。 因此,我们失去了一些继承的好处 我查看了系统类,希望找到更好的解决方案,但我看到的并没有真正帮助我: -有些人尊重静态新模式,并在子类中声明方法 -有些人只使用新实例而不保护它 -有些人将母类用作“类工厂”,如SalesFormLetter static SalesFormLetter construct(

建议将新方法设置为受保护,并使用静态新建。。。减轻方法重载不足的方法。
所以我使用这个模式,正如前面解释的

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

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

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

更好的对象构造解决方案

嗯,
新的
必须去某个地方,在客户机代码中加入大量的
新的
是脆弱和不灵活的。因此,请使用“工厂”类,尤其是相关类

两种选择:

  • 使
    成为新的
    受保护。为每个子类创建一个构造,将工厂构造放在基类中,调用子类构造函数。但是任何人都可以调用子类构造方法

  • 新建
    公开。不要为每个子类创建一个构造,将该构造放在基类中,新建子类。无法保护新类,因为基类不是从子类派生的

  • 无论选择1还是2,最终都会公开子类构造函数。就我个人而言,我更喜欢选择2,因为它是最省事的

    建议:使用
    new
    的参数明确对象依赖关系。这将使您的工厂复杂化,但这是可以的,因为它将复杂性从您的客户机代码移开。Setter方法(
    parm
    methods)是邪恶的,但是
    RunBase
    需要它,因为批处理系统需要它


    也去看看写了什么。

    谢谢你的回答。我想我需要一些时间来完全理解它并付诸实践。