3

[注: CFC にコードを含めることは一般的に悪い習慣です (以下の回答を参照)。そのため、これは単なる調査と考えてください]

要約すると、クラスとサブクラス、およびサブクラスによってオーバーライドされる 1 つのメソッドがあります。子クラスでメソッドをハードコーディングすると、すべて正常に動作しますが、cfinclude を使用して疑似コンストラクターの mixin スタイルに含めると、「ルーチンを複数回宣言することはできません」というメッセージが表示されます。エラー。

これはかなり簡単に思えます。私は何を逃していますか? re: この 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 にまだ存在します。

hola()子 CFC から、(子 CFC で定義された) とsuper.hola()(親で定義された) の両方を参照できます。

を使用する<cfinclude/>と、CFC がインスタンス化され、インクルード ファイルの内容がミックスに追加されます。ただし、これらは継承モデルの一部としては表示されず、「この CFC の他の関数」として表示されるため、エラーが発生します。

リファクタリングの代わりにこれを行うのは悪い習慣であることに同意しますが、ユーティリティ UDF をモデルの一部にせずに混在させることを許可する良い方法です。

于 2012-06-27T20:09:52.607 に答える
1

私はあなたがあなたのものを動かすことができると思います、しかしあなたがしていることをすることは全く良い考えではありません。インクルードは、テキストとHTMLを管理し、画面に情報を出力するのに非常に適しています。関数を含めるために使用されていません。

私はあなたのためにこれを見つけました: http ://www.justskins.com/forums/is-cfincludeing-from-cfcs-81144.html

MacromediaのアーキテクチャディレクターであるSeanCorfieldとメールを交換した後のフォローアップです。

彼は、CFC関数からのcfincludeファイルは「悪い習慣」であると述べました。個人的にはCFCを簡素化するのが良い習慣だと思いましたが、cfincludeを使用しないと、「CFCをより小さくよりまとまりのあるCFCにリファクタリングする」ことが奨励されると彼は言いました。

インクルードファイルのVariablesスコープに「var」変数をコピーすることに関しては、これはCFMX 6.1のバグであり、SeanによるとCF7で修正されています。

ショーンは、cfincludeを使用するとエラーが発生することを具体的には述べていませんが、この方法が奇妙なエラーの原因になっていると思います。エラーはVariablesスコープとは無関係であり、サーバーにRAMを追加したことで解決されると確信していますが、cfincludeが貢献しなかったわけではありません。

CFのドキュメントには、cfincludeを使用しても問題ないと記載されているため、すべてのコードをCFC自体に移動する前に、いくつかのテストを実行する予定です。

于 2012-06-27T19:31:59.820 に答える
1

一般に、cfc 内で cfinclude を使用するのは悪い習慣だと思います。また、このリンクはあなたの問題に関連していると思います: http://www.bennadel.com/blog/972-CFCs-Are-Cached-CFIncludes-Are-Not.htm

于 2012-06-27T19:08:56.823 に答える
0

@iKnowKungFooからの回答に追加するだけで、問題は、Cで機能する<cfinclude>ように、「実際にファイルの一部であるかのように、コードをここに貼り付ける」の省略形ではないということです。#include人々はそれを機能していると見ています。

Cでは、 a#includeはコンパイラ命令です(Cコード自体ではありません)。実際、インクルードされたファイルのコードは、コンパイルされる前に実際にファイルにインクルードされます。

CFでは、それは起こりません。インクルードされたファイルは個別にコンパイルされ、その後、インクルードされたコードがそれをインクルードするコードとインラインであるように見えるようにするために、いくつかのJavaジガリーポケリー(専門用語で申し訳ありません;-)が行われます(それが理にかなっている場合)。

さて...これの影響は何ですか?CFM ファイルがコンパイルされると、その中の関数は UDF としてコンパイルされます。UDF には、継承やオーバーライドなどの概念がありません。それらはそのようなコンテキストではないためです。これらすべてが実装されるのは、 CFCがコンパイルされたときだけです。基本的に、CFM は OO を考慮してコンパイルされていませんが、CFC は特にそうです。

したがって、UDF の規則の 1 つは、要求ごとに指定された名前の関数は 1 つしか存在できないということです...これは、ファイル (そのhola()中にあるもの) を 2 回続けて含む CFM を作成することによって実証できます。エラーになります。なぜこのルールが整っているのか、私にはわかりません。私にとって関数は単なる変数なので、同じ名前の 2 番目の関数宣言は前のものを上書きするだけです。ただ、CFは昔からそうだったので、もう慣れているはずです。コードの場合、UDF (インクルード内) は CFC 内のメソッドと同じ名前を持っているため、エラー状態が発生するのに十分です。これはちょっと理にかなっています。

それは何が起こっているのか、そしてなぜあなたが見ているものを見ているのかを明確にするのに役立ちますか?

于 2012-06-27T22:01:01.400 に答える