如何覆盖Coldfusion中的方法(添加和更改参数等)?

时间:2009-07-14 09:23:05

标签: oop inheritance coldfusion naming

我有两个几乎相同的豆子。

Bean“Item”包含唯一标识符(主键),名称和数组,其中包含与“Item”相关的不同用户数据的结构。

Bean“User”包含一个唯一标识符(主键),firstname,lastname和一个数组,其中包含与“User”相关的不同Items数据的结构。

两个组件都包含两个方法,用于将新数据写入数组中的结构或删除数组元素以及参数的setter和getter。

组件仅通过参数名称,每个init方法所采用的参数数量以及getter和setter的数量而相互偏离。

所以我想创建一个“抽象”Bean,“Item”和“User”继承。我可以通过在Bean中使用extends来获取抽象方法,但是如何覆盖参数名称和变量名称。即AbstractBean中的参数名称ArrayOfData并没有真正告诉别人什么。我想将ItemHasMaterialsArray和UserHasItemsArray作为Item和User bean中的名称。

AbstractBean

<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>

在我的User bean中,我希望init方法也将firstname作为参数并覆盖我的方法中的变量名。告诉我的名字我的其他代码,即呼叫吸气剂,会更清洁。 User.getUserHasMaterials()读取比User.getArrayOfData(),imo好得多。这有可能吗?如果不是我想我将不得不牺牲变量可读性以避免重复。

1 个答案:

答案 0 :(得分:4)

我认为如果你试图避免重复,那么使用组合而不是继承更有意义。

看起来ArrayOfData可以是它自己的CFC,使用update(),delete()和toArray()等方法。然后,您可以将ArrayOfData的实例传递给User或Item对象。

您的用户CFC可能如下所示:

<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>