CFML中的通用OO:是否可以动态扩展CFC?

时间:2013-08-14 23:26:43

标签: inheritance coldfusion

(我可能从一开始就走错了路,所以我的问题标题可能需要编辑......)

对于电子商务应用,我在应用中有一个StoreBase CFC和“子类”CFCs StoreCheckout,StoreCart和其他模块/对象。

有些客户具有模块特定的业务逻辑,因此我们根据需要创建具有自定义功能的CFC - 例如,StoreCartClientX扩展了StoreCart并覆盖了一些计算。

某些客户端还具有自定义基本业务逻辑 - 例如,StoreBaseClientX扩展了StoreBase,并根据自定义规则限制对应用程序某些部分的访问。

我的问题是,当StoreBaseClientX存在时,我需要一种方法来告诉StoreCart扩展StoreBaseClientX,这似乎需要动态扩展,而这似乎是基于SO中的各种帖子(在信仰上采取)的坏主意(在任何情况下,我正在使用ColdFusion(继续,笑),并且不允许动态表达式进行扩展。)

这是一些用于说明问题的伪代码。

public class StoreBase {
    checkRights(){
      //standard rights check
    }

    findWishList(){
   }
}

public class StoreBaseClientX extends storeBase {
       checkRights(){
         //custom rights check for ClientX
       }
}


   public class StoreCart extends StoreBase { //if StoreBaseClientX exists, it should extend that instead


   }

3 个答案:

答案 0 :(得分:1)

简短回答:您可以使用静态工厂为您创建课程。

答案很长:从我到目前为止所读到的内容来看,我认为你应该熟悉战略模式。 http://en.wikipedia.org/wiki/Composition_over_inheritance

答案 1 :(得分:1)

处理此问题的一种方法是始终包含StoreBaseClient,而不是尝试使其存在可选。只需将StoreBaseClient作为空存根类发送,客户端可根据需要进行自定义。示例组件:

<cfcomponent name="StoreBase">
   <!--- your code --->
</cfcomponent>

<cfcomponent name="StoreBaseClient" extends="StoreBase">
   <!--- empty --->
</cfcomponent>

<cfcomponent name="StoreCart" extends="StoreBaseClient">
   <!--- your code --->
</cfcomponent>

希望有所帮助。

答案 2 :(得分:0)

首先,您使用的继承模型是StoreCheckoutStoreCart扩展StoreBase正确吗? StoreBase似乎StoreCheckout可以说StoreBase StoreCart以及StoreBase 是< / strong> StoreCheckout?两者中的示例方法是什么?您确定StoreCartStoreBase不应该是每个都有 StoreBase(即:extends对象是其他类的内容是初学者了吗?

但无论如何,这只是需要考虑的事情,与你的问题相关。如果你愿意的话,可能会在Code Review上弹出一些内容供我们查看?

拉斯说,我会扭转局面。而不是必须弄清楚特定于客户端的子组件是否存在,然后如果存在,使用它而不是基本组件,您应该始终具有客户端可自定义的子组件,并始终在你的代码中引用那些,而不是基本组件。

简而言之,在ColdFusion中,组件不能具有动态/运行时{{1}}属性,没有。它必须在编译时出现。