2

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

对于电子商务应用程序,我有一个 StoreBase CFC,以及应用程序内的“子类”CFC StoreCheckout、StoreCart 和其他模块/对象。

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

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

我的问题是,我需要一种方法来告诉 StoreCart 在存在 StoreBaseClientX 时扩展 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


   }
4

3 回答 3

1

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

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

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

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

希望有帮助。

于 2013-08-15T05:11:16.633 回答
1

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

长答案:从我目前阅读的内容来看,我认为您应该熟悉策略模式。 http://en.wikipedia.org/wiki/Composition_over_inheritance

于 2013-08-15T00:38:47.437 回答
0

首先,您使用的继承模型StoreCheckoutStoreCart扩展都StoreBase正确吗?对我来说似乎不太可能StoreBase有人可以说StoreCheckout is a StoreBase以及StoreCart is a StoreBase ? 两者中的示例方法是什么?你确定StoreCheckout并且StoreCart不应该这样每个都有一个 StoreBase(即:StoreBase对象是其他类被初始化的东西)?

但无论如何,这只是需要考虑的事情,并且与您的问题无关。如果您愿意,也许可以在Code Review上弹出一些内容供我们查看?

正如拉斯所说,我会扭转局面。不必确定是否存在特定于客户端的子组件,如果存在,请使用它而不是基本组件,您应该始终拥有客户端可自定义的子组件,并始终在代码中引用这些子组件,而不是基础组件。

不过,简而言之,extends在 ColdFusion 中的组件上不能有动态/运行时属性,不。它必须在编译时存在。

于 2013-08-15T06:49:08.397 回答