首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用cfinclude将组件拆分,并仍然使用继承?

如何使用cfinclude将组件拆分,并仍然使用继承?
EN

Stack Overflow用户
提问于 2010-06-12 20:58:02
回答 5查看 913关注 0票数 3

更新:似乎根本没有这个问题。

更新:我投票结束这个问题,因为我觉得人们总体上更关注“有人有更好的想法拆分大型组件”这个问题的一部分(我不应该把这个问题放进去),然后才是用cfcomponent使用cfincludes的真正问题。

注意:这只是一个简单的例子,说明了我正试图做些什么来让人们了解这个想法。

我遇到的问题是,我希望在cfcomponent中使用cfinclude,这样我就可以将类似的方法分组到单独的文件中,以获得更多的可管理性。我遇到的问题是,当我试图扩展另一个组件时,它也使用cfinclude来管理它的方法,如下所示。注意,ComponentA扩展了ComponentB:

代码语言:javascript
复制
ComponentA
==========
<cfcomponent output="false" extends="componentb">
    <cfinclude template="componenta/methods.cfm">
</cfcomponent>

componenta/methods.cfm
======================
<cffunction name="a"><cfreturn "componenta-a"></cffunction>
<cffunction name="b"><cfreturn "componenta-b"></cffunction>
<cffunction name="c"><cfreturn "componenta-c"></cffunction>
<cffunction name="d"><cfreturn super.a()></cffunction>

ComponentB
==========
<cfcomponent output="false">
    <cfinclude template="componentb/methods.cfm">
</cfcomponent>

componentb/methods.cfm
======================
<cffunction name="a"><cfreturn "componentb-a"></cffunction>
<cffunction name="b"><cfreturn "componentb-b"></cffunction>
<cffunction name="c"><cfreturn "componentb-c"></cffunction>

问题是,当我尝试初始化ComponentA时,我得到了一个错误:“例程不能被声明不止一次。例程a在不同的模板中被声明了两次”。

之所以出现这种情况,是因为当您使用cfinclude时,它是在运行时而不是在编译时进行评估的。

如果不将方法移动到组件本身并消除cfinclude的使用,我如何才能绕过这个问题,或者有人对拆分大型组件有更好的想法呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-12 21:17:05

我的建议是:重新分析对象,尝试应用于所有OOP规则和最佳实践(抽象、封装、模块化、多态、继承、DRY等)。

因此,基本上您希望组件B有方法isCrunchable(),然后组件A扩展B,isCrunchable()可以从继承中获得。A和B都会返回不同的状态,所以我看不出有什么问题。如果您在“上面”创建了一个类,使所有方法和组件A和B都扩展了该类,那么您就可以得到“大型组件”的解决方案,但是,我还是会尝试更多地处理这个问题。

如果这个答案没有帮助,你可以张贴真实的例子,也许我们会更好地了解你为什么要这样做。

票数 0
EN

Stack Overflow用户

发布于 2010-06-13 03:22:34

没有经过测试,但我会尝试将每个函数的内容包含在一个包含中,但是定义组件文件本身中的函数。`

代码语言:javascript
复制
<cfcomponent name="a">
    <cffunction name="aa">
        <cfinclude template="componenta/functiona.cfm" />
    </cffunction>
</cfcomponent>

祝好运。

票数 2
EN

Stack Overflow用户

发布于 2010-06-12 22:49:46

我同意扎尔科的说法,你应该重新安排你的目标,但如果你必须.

在CF5中,我使用了将函数放入请求范围的技巧。这可以通过将函数名分配给同名的请求变量(即用于名为getLatestUpdate的函数)来实现:

代码语言:javascript
复制
Request.getLatestUpdate = getLatestUpdate

然后,在包含带有函数的文件之前,对请求范围中的变量进行切赫操作。如果请求作用域变量不存在,则只有cfinclude函数文件。

缺点是您需要引用带有请求范围前缀的函数,而且这只会在传统的页面请求隐喻中起作用,它很可能会中断诸如远程处理调用之类的事情。

我还没测试过这个和YMMV。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3030056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档