Как переопределить методы в Coldfusion (добавление и изменение аргументов и т. Д.)? - PullRequest
1 голос
/ 14 июля 2009

У меня есть две почти идентичные Бобы.

Бин "Item" содержит уникальный идентификатор (первичный ключ), имя и массив, который содержит структуры с данными для разных пользователей, связанных с "Item".

Бин "Пользователь" содержит уникальный идентификатор (первичный ключ), имя, фамилию и массив, который содержит структуры с данными различных Элементов, связанных с "Пользователем".

Оба компонента содержат два метода, которые записывают новые данные в структуры массива или удаляют элементы массива, а также методы установки и получения аргументов.

Компоненты отличаются друг от друга только через имена аргументов, количество аргументов, принимаемых каждым методом init, и число получателей и установщиков.

Итак, я хочу создать "Абстрактный" Бин, от которого наследуются "Предмет" и "Пользователь". Я могу сделать это, используя extends в Beans для получения абстрактных методов, но как мне переопределить имена аргументов и имена переменных. То есть имя аргумента ArrayOfData в AbstractBean на самом деле никому ничего не говорит. Я хотел бы иметь ItemHasMaterialsArray и UserHasItemsArray в качестве имен в компонентах Item и User.

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 я хотел бы, чтобы метод init также принимал firstname в качестве аргумента и переопределял имена переменных в моих методах. С сообщением имен мой другой код, то есть вызывающий получатель, будет намного чище. User.getUserHasMaterials () читается намного лучше, чем User.getArrayOfData (), imo. это вообще возможно? Если нет, то я думаю, что придется пожертвовать читаемостью переменных, чтобы избежать дублирования.

1 Ответ

4 голосов
/ 14 июля 2009

Я думаю, что если вы пытаетесь избежать дублирования, возможно, имеет смысл использовать композицию, а не наследование.

Похоже, что 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>

...