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

发布于 2024-07-26 17:51:17 字数 4192 浏览 3 评论 0原文

我有两个几乎相同的 Bean。

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

Bean“User”包含唯一标识符(主键)、名字、姓氏和一个数组,该数组包含具有与“User”相关的不同项目的数据的结构。

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

这些组件之间的区别仅在于参数名称、每个 init 方法采用的参数数量以及 getter 和 setter 的数量。

所以我想创建一个“抽象”Bean,“项目”和“用户”从中继承。 我可以通过在 Bean 中使用 extends 来获取抽象方法来实现这一点,但是如何覆盖参数名称和变量名称。 即 AbstractBean 中的参数名称 ArrayOfData 并没有真正告诉某人任何事情。 我希望将 ItemHasMaterialsArray 和 UserHasItemsArray 作为 Item 和 User beans 中的名称。

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 方法也将名字作为参数并覆盖我的方法中的变量名称。 通过告诉名字,我的其他代码,即调用吸气剂,会干净得多。 在我看来,User.getUserHasMaterials() 读起来比 User.getArrayOfData() 好得多。 这可能吗? 如果不是,我想我将不得不牺牲变量的可读性以避免重复。

I have two almost identical Beans.

Bean "Item" contains a unique identifier (primary key), a name and an array that contains structs with data for different Users that are related to the "Item".

Bean "User" contains a unique identifier (primary key), a firstname, a lastname and an array that contains structs with data of different Items that are related to the "User".

Both components contain two methods that write new data to the structs in the array or delete array elements and the setters and getters for the arguments.

The components deviate from each other only through theire argument names, the number of arguments each init method takes and the number of getters and setters.

So i want to create an "Abstract" Bean from which "Item" and "User" inherit. I can do so by using extends in the Beans to get the abstract methods, but how do i override the argument names and variable names. I.e. the argument name ArrayOfData in the AbstractBean does not really tell someone anything. I would like to have ItemHasMaterialsArray and UserHasItemsArray as names in the Item and User beans.

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>

In my User bean i would like the init method to also take firstname as an argument and override the variable names in my methods. With telling names my other code, i.e. calling the getters, would be much cleaner. User.getUserHasMaterials() reads much better than User.getArrayOfData(), imo. is this even possible? If not than i guess i will have to sacrifice variables readability to avoid duplication.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧时浪漫 2024-08-02 17:51:17

我认为如果您想避免重复,那么使用组合而不是继承可能更有意义。

看起来 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>

I think if you're trying to avoid duplication, it might make more sense to use composition rather than inheritance.

It looks like ArrayOfData could be be its own CFC, with methods like update(), delete(), and toArray(). Then you could pass an instance of ArrayOfData to either your User or Item object.

Your User CFC might look something like this:

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文