3

[注意:在您的 cfcs 中包含代码通常是不好的做法,(请参阅下面的答案),因此请考虑这只是研究]

总而言之,我有一个类和一个子类以及一个被子类覆盖的方法。当我在子类中对方法进行硬编码时,一切正常,当我使用 cfinclude 将其包含在伪构造函数中时,mixin 样式,我得到一个“不能多次声明例程”。错误。

这似乎很简单。我想念什么:这个混音?

父类:

<cfcomponent >
    <cffunction name="hola" hint="i am the parent method">
        <cfreturn "hola - parent">
    </cffunction>
</cfcomponent>

子班:

<cfcomponent extends="mixinTestParent">
    <!---   this would work, successfully overridding parent method
    <cffunction name="hola" hint="i am the child method">
        <cfreturn "hola - child">
    </cffunction>--->

    <cfinclude template="mixinTestInc.cfm">

    <cffunction name="init" access="public" returntype="any" output="false">
        <cfreturn this>
    </cffunction>
</cfcomponent>

包括:

<cffunction name="hola" hint="i am the child method" access="public">
        <cfreturn "hola - child">
    </cffunction> 

跑步者:

<cfset test = new mixinTestChild().init()>
<cfdump var="#test.hola()#">

提前致谢!!

4

4 回答 4

7

由于实例化 CFC 的方式,您会收到错误消息。

当您hola()在父级和hola()子级中具有子级扩展父级时,当创建子级 CFC 时,它会hola()在父级中看到并覆盖它。但是,该功能仍然存在于 CFC 中。

从子 CFC 中,您可以引用hola()(在子 CFC 中定义)和super.hola()(在父 CFC 中定义)。

当您使用<cfinclude/>时,CFC 被实例化,并且包含文件的内容被添加到混合中。但是,它们不被视为继承模型的一部分,就像“此 CFC 中的其他函数”一样,因此您会收到错误消息。

我同意在完成而不是重构时这是一种不好的做法,但这是一种允许实用 UDF 混合而不使它们成为模型的一部分的好方法。

于 2012-06-27T20:09:52.607 回答
1

我认为在 cfc 中使用 cfinclude 通常是不好的做法。另外,我认为此链接与您的问题有关:http ://www.bennadel.com/blog/972-CFCs-Are-Cached-CFIncludes-Are-Not.htm

于 2012-06-27T19:08:56.823 回答
1

我认为你可以让你的东西正常工作,但做你正在做的事情根本不是一个好主意。包括管理文本和 HTML 以及将信息输出到屏幕的工作非常好。它不用于包含功能。

我为你找到了这个: http ://www.justskins.com/forums/is-cfincludeing-from-cfcs-81144.html

只是在与 Macromedia 的架构总监 Sean Corfield 交换电子邮件后的后续行动。

他说从 CFC 函数中包含文件是“不好的做法”。我个人认为简化 CFC 是一种很好的做法,但他说不使用 cfinclude 会鼓励人们“将他们的 CFC 重构为更小、更有凝聚力的 CFC”。

至于将“var”变量复制到包含文件的变量范围内,这是 CFMX 6.1 的一个错误,据 Sean 称,该错误已在 CF7 中修复。

Sean 没有具体说使用 cfinclude 会导致错误,但我倾向于相信这种做法确实导致了我们奇怪的错误。我们的错误与变量范围无关,我相信现在我们向服务器添加了 RAM,它们将得到解决,但这并不是说 cfinclude 没有贡献。

CF 的文档确实说可以使用 cfinclude,因此我们可能会在将所有代码移入 CFC 本身之前运行一些测试。

于 2012-06-27T19:31:59.820 回答
0

只是为了补充@iKnowKungFoo的答案,问题在于这<cfinclude>不是“将代码粘贴在这里,就好像它实际上是文件的一部分”的简写,就像#include在C中工作一样。我这么说是因为这是大多数人们认为它有效。

在 C 中,a#include是编译器指令(不是 C 代码本身),实际上包含文件中的代码在编译之前实际上已包含在文件中。

在 CF 中,情况并非如此。包含的文件是单独编译的,然后发生一些 Java jiggery-pokery(对不起,技术术语;-),以使包含的代码看起来与包含它的代码内联(如果有意义的话)。

现在......这有什么后果?当 CFM 文件编译时,其中的函数编译为 UDF,它没有任何继承或覆盖或类似的概念,因为它们不是那种上下文。只有在编译CFC时,才能实现所有这些东西。基本上,CFM 编译时没有考虑任何面向对象的因素,而 CFC 则专门考虑在内。

因此,UDF 的规则之一是每个请求只能有一个给定名称的函数......这可以通过创建一个hola()连续两次包含您的文件(其中的文件)的 CFM 来证明:您会报错。现在我不知道为什么会有这条规则。对我来说,函数只是一个变量,所以第二个同名的函数声明应该只是覆盖前一个。不过CF一直都是这样的,所以我们现在应该已经习惯了。对于您的代码,您的 UDF(在包含中)与 CFC 中的方法具有相同的名称,这足以发生错误情况。这有点道理。

这是否有助于澄清正在发生的事情,以及为什么你会看到你所看到的?

于 2012-06-27T22:01:01.400 回答