(我可能从一开始就走错了路,所以我的问题标题可能需要编辑......)
对于电子商务应用,我在应用中有一个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
}
答案 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)
首先,您使用的继承模型是StoreCheckout
和StoreCart
扩展StoreBase
正确吗? StoreBase
似乎StoreCheckout
可以说StoreBase
是 StoreCart
以及StoreBase
是< / strong> StoreCheckout
?两者中的示例方法是什么?您确定StoreCart
和StoreBase
不应该是每个都有 StoreBase
(即:extends
对象是其他类的内容是初学者了吗?
但无论如何,这只是需要考虑的事情,与你的问题相关。如果你愿意的话,可能会在Code Review上弹出一些内容供我们查看?
拉斯说,我会扭转局面。而不是必须弄清楚特定于客户端的子组件是否存在,然后如果存在,使用它而不是基本组件,您应该始终具有客户端可自定义的子组件,并始终在你的代码中引用那些,而不是基本组件。简而言之,在ColdFusion中,组件不能具有动态/运行时{{1}}属性,没有。它必须在编译时出现。