2

状況はこちら。コンポーネント B はコンポーネント A を拡張initし、別のパラメーターを受け入れるようにメソッドをオーバーライドします。A にはcreateを呼び出すメソッドもありますinit

B のインスタンスがありcreate、その呼び出しが間違っている場合init、B で init を呼び出しますが、A で init を呼び出す必要があります。

常にあるとは限らないので、電話したくsuper.init()ありませんsuper。親コンポーネントで init を呼び出すように指定する方法はありますか?

4

3 に答える 3

2

実行する実際のコードを独自のメソッドにリファクタリングし、Init メソッドでそのコードを呼び出し、create メソッドでもそのコードを呼び出すようにします。

現時点では、オブジェクトが適切に設計されていないようです。メソッドをより小さく、より制約のある単位に分解してみてください。

編集:

私の答えはまだ立っていると思います。

親コンポーネントの Init メソッドが何らかの処理を行う場合は、その処理を新しいメソッド (「initDoStuff()」など) に移動し、init メソッドにそのメソッドを呼び出させます。

次に、create メソッドで init の代わりに initDoStuff() メソッドを呼び出すようにします。

ColdFusion は動的に型付けされる言語であり、異なるパラメーターを受け入れるためだけにメソッドをオーバーライドする必要はありません。他の方法でそれを行うことができます。

CF は、引数のシグネチャに基づいてメソッドを選択できません。したがって、このような状況が発生した場合は、別の方法で対処する必要があります。

基本的に、メソッドをオーバーライドして引数の型を変更するという考え方は、ColdFion では実際には有効ではありません。

コンポーネント A:

<cffunction name="init" access="public" output="false">
  <cfargument name=... ...>
  <cfreturn initDoSomething(argumentCollection=arguments)>
</cffunction>

<cffunction name="initDoSomething" access="package" output="false">
  {do stuff}
  <cfreturn {whatever}>
</cffunction>

コンポーネント B:

<cffunction name="create" access="package" output="false">
  <cfset {something} = initDoSomething({whatever arguments})>
  <cfreturn {whatever}>
</cffunction>
于 2010-04-26T20:49:23.647 に答える
1

基本イニシャライザを呼び出します。実行している言語はわかりませんが、C# では、たとえば B b = new B() : base(parameters...) もちろん、コンポーネントが含まれているかどうかを確認する必要があります。タイプAまたはBの事実ですが、ほとんどの言語でそれを行うことができます.

これにより、拡張イニシャライザも実行されますが、そのとおりです。拡張オブジェクト初期化子を取り除きたい場合は、親型オブジェクトを作成するだけでよいと思います。私が考えることができる唯一のことです。

もちろん、オプションと構文を知るために、プログラミングに使用している言語を指定すると役立ちます。

于 2010-04-26T20:42:54.640 に答える
1

createメソッドを call super.createandに拡張することでこれを解決しましたsuper.init。失敗する子 init への呼び出しがまだありますが、全体的には機能します。

作成をオーバーライドすることなく、親の初期化で機能するソリューションを引き続き好むでしょう。

于 2010-04-26T21:19:47.333 に答える