6

ColdFusion のコンストラクターについていくつか質問があります。

  1. init名前をコンストラクタ名として使用する必要がありますか?
  2. init メソッドを呼び出さずにコンポーネントのインスタンスを作成すると、何が返されますか?

    instance=createObject("コンポーネント","cfcName"); // インスタンスが現在保持している値

  3. init メソッドのコードを取り出して init メソッドを削除し、そのコードをコンポーネントの先頭に貼り付けることはできますか? init コンストラクターと同じ効果がありますか?

まことにありがとうございます。

4

3 に答える 3

14

コンストラクター名としてinitという名前を使用する必要がありますか?

いいえ、初期化関数には任意の名前を付けることができます。init()単なる慣習です。また、自動的に呼び出されないため、実際のコンストラクターではありません。

initメソッドを呼び出さずにコンポーネントのインスタンスを作成すると、何が返されますか?

期待どおり、コンポーネントインスタンスが返されます。関数の有無init()はまったく関係ありません。ColdFusionコンポーネントには静的関数の概念はありません。常に、から完全に構築されたインスタンスを取得しますGetObject("component", ...)。(最初に使用する直前に作成されたJavaオブジェクトの場合は、手動で行うのを忘れた/しなかった場合はそうではありません。)

initメソッドのコードを取り出してinitメソッドを削除してから、コードをコンポーネントのヘッドに貼り付けることはできますか?それはinitコンストラクターと同じ効果がありますか?

はい、メソッドがパラメータを受け取らない限り、init()違いはありません。

init()ただし、コンポーネントインスタンスを返すメソッドを呼び出すのが慣例です。「」以外は何もしなくても<cfreturn this>。厳密に必要でなくても、一貫性を保ち、すべてのコンポーネントに1つ追加します。

于 2009-07-10T08:28:51.693 に答える
10

Tomalak の答えは ColdFusion 8 では正しいです。ただし、今年後半にリリース予定の ColdFusion 9 では状況が少し変わりつつあります。(完全を期すために、Tomalakの回答をコピーし、必要に応じて調整します。開始していただきありがとうございます。:))


コンストラクタ名として init という名前を使用する必要がありますか?

CF8:いいえ、初期化関数には好きな名前を付けることができます。「init」は単なる慣習です。また、自動的に呼び出されないため、真のコンストラクターではありません。

CF9:答えはまだ「いいえ」です。そうする必要はありませ。これは、cfscript (または CF9 にも導入されるスクリプトのみのコンポーネント) 内でのオブジェクトの作成に適用されます。importandキーワードが追加され、次のnewようにオブジェクトのインスタンスを作成できるようになります。

import model.security.*;
userObj = new User();

これは、フォルダーUser.cfc内にがあることを前提としています。model/security/さらに、CF9 は、"init" という名前のメソッドまたはオブジェクトと同じ名前 (この場合は "User") を持つメソッドの存在を探し、これをコンストラクターとして暗黙的に呼び出します。

newJava/C で見られるように、引数をディレクティブに渡すとコンストラクタに転送されるかどうかはわかりません。私はそうなると思いますが、いずれかの方法を示すプレゼンテーションやコード例はまだ見たことがありません。これを書いているときに思いついたので、自分でテストしていません。;) (別のアイデア: 異なる引数セットを持つ複数のコンストラクターがサポートされるかどうか疑問に思います。私はそれを疑っていますが、それは素晴らしいアイデアです。)

同様の機能が CFML (cfscript とは別のタグベースの言語) に現れる可能性があるという暗示があると思いますが、現時点ではそれについては何も言われていません。

init メソッドを呼び出さずにコンポーネントのインスタンスを作成すると、何が返されますか?

ご想像のとおり、コンポーネント インスタンスが返されます。init() 関数の有無はまったく関係ありません。ColdFusion コンポーネントには静的関数の概念はありません。常に GetObject("component", ...) から完全に構築されたインスタンスを取得します。(手動で作成するのを忘れた/しなかった場合、最初の使用の直前に作成される Java オブジェクトの場合はそうではありません。)

init メソッドのコードを取り出して init メソッドを削除し、コードをコンポーネントの先頭に貼り付けることはできますか? init コンストラクターと同じ効果がありますか?

はい、init() メソッドがパラメータを取らない限り、違いはありません。

ただし、コンポーネント インスタンス ("this") を返す init() というメソッドを使用するのが慣例です。" " 以外は何もしなくてもreturn this;。厳密には必要ない場合でも、一貫性を保ち、すべてのコンポーネントに 1 つ追加します。

于 2009-07-10T18:20:40.640 に答える
1

一部のサードパーティライブラリ/フレームワークはinit、コンストラクター関数(明らかに、CF9より前)であると期待する場合があります。たとえば、ColdSpringはinit、コンストラクター引数を渡そうとしたときに呼び出されるメソッドを探すと思います。

Adamの答えに応えて、CF9には複数のコンストラクターが含まれないと確信しています。これは、メソッドのオーバーロードが必要になるためですが、これについては何も聞いていません。通常の回避策は、ダックタイピングを利用して引数の型をチェックし、オプションの引数を提供することです(名前付き引数を渡す機能により、これをかなり簡単に処理できます)。

ダックタイピングに関するSeanCorfieldのプレゼンテーションへのリンク:http://corfield.org/articles/ducktyping_cfunited.pdf

于 2009-07-12T18:07:59.750 に答える