2009-07-14 15 views
1

私は2つのほぼ同じBeanを持っています。Coldfusionでメソッドをオーバーライドする方法(引数の追加や変更など)?

「アイテム」には、一意の識別子(主キー)、名前、および「アイテム」に関連する異なるユーザーのデータを含む構造体を含む配列が含まれます。

Bean「ユーザー」には、一意の識別子(主キー)、名字、姓、および「ユーザー」に関連する異なる項目のデータを含む構造体を含む配列が含まれます。

両方のコンポーネントには、配列の構造体に新しいデータを書き込むか、配列要素を削除する2つのメソッドと、引数のセッターとゲッターが含まれています。

コンポーネントは、それぞれの引数の名前、各initメソッドがとる引数の数、およびgetterとsetterの数だけによって互いに矛盾します。

「Item」と「User」が継承する「Abstract」Beanを作成したいと思います。私はBeanのextendsを使って抽象メソッドを得ることができますが、引数名と変数名をどのように上書きするのですか?私。 AbstractBeanの引数名ArrayOfDataは実際に誰かに何も伝えません。私はItemHasMaterialsArrayとUserHasItemsArrayをItemとUser Beanの名前として使用したいと考えています。私のユーザー豆で

<cfcomponent name="AbstractBean" output="false"> 
<cffunction name="init" access="public" hint="constructor" returntype="AbtractBean"> 
    <cfargument name="Identifier" required="false" type="Numeric" default="0"> 
    <cfargument name="Name" required="false" type="String" default=""> 
    <cfargument name="ArrayOfData" required="false" type="Array" default="#arrayNew(1)#"> 

    <cfset variables.instance = structNew() /> 
    <cfset setIdentifier(arguments.identifier) /> 
    <cfset setName(arguments.name) /> 
    <cfset setArrayOfData(arguments.ArrayOfData) /> 
    <cfreturn this /> 
</cffunction> 

<cffunction name="updateArrayOfData" access="public" output="true" returntype="boolean"> 
    <cfargument name="blank" type="Struct" required="true"> 
    <cfset var i = 0 /> 
    <cfset var form = arguments.blank /> 
    <cfset var ArrayOfData = arrayNew(1) /> 
    <cfset ArrayOfData = this.getArrayOfData() /> 

    <cfloop index="i" from="#arrayLen(ArrayOfData)#" to="1" step="-1"> 
    <cfif ArrayOfData[i].Amount neq structFind(form,ArrayOfData[i].Id) and LsIsNumeric(structFind(form,ArrayOfData[i].Id))> 
    <cfset ArrayOfData[i].Amount = structFind(form,ArrayOfData[i].Id) /> 
    <cfelse> 
    <cfset arrayDeleteAt(ArrayOfData,i) /> 
    </cfif> 
    </cfloop> 
    <cfset setArrayOfData(ArrayOfData) /> 
    <cfreturn true /> 
</cffunction> 

<cffunction name="deleteArrayOfDataElement" access="public" output="false" returntype="boolean"> 
    <cfargument name="blank" type="Struct" required="true"> 
    <cfset var i = 0 /> 
    <cfset var form = arguments.blank /> 
    <cfset var ArrayOfData = arrayNew(1) /> 
    <cfset ArrayOfData = this.getArrayOfData() /> 

    <cfloop index="i" from="#arrayLen(ArrayOfData)#" to="1" step="-1"> 
    <cfif not listFind(form.del,ArrayOfData[i].UserId,',')> 
    <cfset arrayDeleteAt(ArrayOfData,i) /> 
    </cfif> 
    </cfloop> 
    <cfset setArrayOfData(ArrayOfData) /> 
    <cfreturn true /> 
</cffunction> 

<cffunction name="setIdentifier" hint="setter" access="private" output="false" returntype="Void"> 
    <cfargument name="identifier" required="true" type="Numeric" hint="Primary Key, really" /> 
    <cfset variables.instance.Identifier = arguments.Identifier /> 
</cffunction> 

<cffunction name="getIdentifier" hint="getter" access="public" output="false" returntype="Numeric"> 
    <cfreturn variables.instance.identifier /> 
</cffunction> 

<cffunction name="setName" access="private" output="false" returntype="Void"> 
    <cfargument name="name" required="true" type="String" /> 
    <cfset variables.instance.Name = arguments.Name /> 
</cffunction> 

<cffunction name="getName" access="public" output="false" returntype="String"> 
    <cfreturn variables.instance.Name /> 
</cffunction> 

<cffunction name="setArrayOfData" access="private" output="false" returntype="Void"> 
    <cfargument name="ArrayOfData" required="true" type="Array" /> 
    <cfset variables.instance.ArrayOfData = arguments.ArrayOfData /> 
</cffunction> 

<cffunction name="getArrayOfData" access="public" output="false" returntype="Array"> 
    <cfreturn variables.instance.ArrayOfData /> 
</cffunction> 
</cfcomponent> 

AbstractBean

私はまた、引数としてファーストネームを取り、私の方法で変数名をオーバーライドするinitメソッドをしたいと思います。名前を伝えると、他のコード、つまりgetterを呼び出すことで、はるかにクリーンになります。 User.getUserHasMaterials()はUser.getArrayOfData()、imoよりもはるかに優れています。これも可能ですか?私が推測するよりも、重複を避けるために変数の可読性を犠牲にしなければならないと思います。

答えて

4

私は、重複を避けようとすると、継承よりも構図を使う方が意味があると思います。

ArrayOfDataはupdate()、delete()、toArray()などのメソッドを持つ独自のCFCである可能性があります。次に、ArrayOfDataのインスタンスをUserオブジェクトまたはItemオブジェクトに渡すことができます。

<cfcomponent name="User"> 
<cffunction name="init" access="public" hint="constructor" returntype="User"> 
    ... 
    <cfargument 
     name="materials" 
     required="false" 
     type="ArrayOfData" 
     default="#arrayNew(1)#" 
     > 
    ... 

    <cfset variables.materials = createObject("component", "ArrayOfData")> 
    <cfset setMaterials(arguments.materials)/> 
    <cfreturn this /> 
</cffunction> 

<cffunction name="setMaterials"> 
    <cfargument name="value" type="Array"> 
    <cfset variables.materials.update(arguments.value)> 
</cffunction> 

<cffunction name="getMaterials"> 
    <cfreturn variables.materials.toArray()> 
</cffunction> 

<cffunction name="deleteMaterials"> 
    <cfargument name="blank"> 
    <cfset variables.materials.delete(arguments.blank)> 
</cffunction> 

+0

ありがとう:

ユーザーCFCは、次のようになります。あなたは正しいですが、それは "is a"の代わりに "has a"の関係です。私はこれらのすべてのoopの概念をゆっくりと捉えています。構成:チェック;) – mrt181