Inheritance 继承的CFC未填充
我有两个CFC,它们是带有DAO函数的bean。我已经在子cfc扩展父cfc的地方设置了继承 两个物体具有相同的结构;函数:init、read等,属性:ID等 当我创建子对象时,我传递一个ID,它读取数据,获取父对象的外键parentID,然后使用适当的参数调用Super.init() 我意想不到的结果是: 子对象的ID和parentID都相同,并且在返回对象时都是parentID值。超级调用后将覆盖childs variables.ID。我假设两个变量都可以访问variables范围,因此当parent设置variables.ID时,它会覆盖子variables.ID。如果不以不同的方式命名ID,是否可以避免这种情况 父对象的读取函数似乎未执行。例如,如果我将父读取函数重命名为“read2”,则该函数将执行。我还怀疑这些函数驻留在共享作用域中,因此childs read函数正在执行 有没有办法保持相同的cfc结构,并使该功能按预期工作 提前谢谢Inheritance 继承的CFC未填充,inheritance,coldfusion,cfc,Inheritance,Coldfusion,Cfc,我有两个CFC,它们是带有DAO函数的bean。我已经在子cfc扩展父cfc的地方设置了继承 两个物体具有相同的结构;函数:init、read等,属性:ID等 当我创建子对象时,我传递一个ID,它读取数据,获取父对象的外键parentID,然后使用适当的参数调用Super.init() 我意想不到的结果是: 子对象的ID和parentID都相同,并且在返回对象时都是parentID值。超级调用后将覆盖childs variables.ID。我假设两个变量都可以访问variables范围,因此当p
<cfcomponent accessors="true" extends="Custom" output="false">
<cfproperty name="ID" type="numeric" />
<cfproperty name="listID" type="numeric" />
<cfproperty name="customfieldID" type="numeric" />
<cfscript>
variables.dsn = '';
</cfscript>
<cffunction name="init" access="public" output="false" returntype="ListCustom">
<cfargument name="dsn" type="string" required="true" />
<cfargument name="ID" type="numeric" required="true" />
<cfargument name="listID" type="numeric" required="false" default="0" />
<cfargument name="customFieldID" type="numeric" required="false" default="0" />
<cfscript>
variables.dsn = arguments.dsn;
variables.ID = arguments.ID;
variables.listID = arguments.listID;
variables.customFieldID = arguments.customFieldID;
if (variables.ID){
read();
if (variables.customFieldID){
Super.init(dsn=variables.dsn,ID=variables.customfieldID);
}
}
</cfscript>
<cfreturn this />
</cffunction>
<cffunction name="read" access="private" output="false" returntype="void">
<cfquery name="local.q" datasource="#variables.dsn#">
SELECT customfieldID, listID
FROM listCustomFields
WHERE ID = <cfqueryparam value="#variables.ID#" cfsqltype="cf_sql_integer">
</cfquery>
<cfif local.q.recordcount>
<cfset variables.listID = local.q.listID />
<cfset variables.customFieldID = local.q.customFieldID />
</cfif>
</cffunction>
variables.dsn='';
variables.dsn=arguments.dsn;
variables.ID=arguments.ID;
variables.listID=arguments.listID;
variables.customFieldID=arguments.customFieldID;
if(variables.ID){
read();
if(变量.自定义字段ID){
Super.init(dsn=variables.dsn,ID=variables.customfieldID);
}
}
选择customfieldID、listID
从listCustomFields
其中ID=
variables.dsn='';
variables.dsn=arguments.dsn;
variables.ID=arguments.ID;
variables.fieldName=arguments.fieldName;
if(variables.ID){
read();
}
选择字段名
来自CustomField
其中ID=
我认为之所以会发生这种情况,是因为CF如何在整个对象的变量范围内而不是在CFC的独占范围内(如普遍接受的VARIABLES.instance struct practice)定义CF scopes
cfproperty
值
变量范围在对象中共享,包括继承的父对象,因此通过在父对象和子对象中命名ID值,实际上只需声明两次,而不是声明两个单独的变量。然后,当您将ID传递给您的super.init()
时,它会将您的ID值覆盖到您的子ID,并将ID值传递到父bean中,从而产生结果。如果您希望以不同的方式看到这一点,请尝试在您的子级中创建一个测试函数,该函数与父级中的变量名共享。在super.init()
中为该变量指定一个值,并观察子函数从对象中消失
所以说,我不认为你不做你不想做的事情就可以解决问题。您需要为父ID使用不同的名称,或者不使用内置的访问器功能并手动编写所有getter函数,将它们设置在CFC专用的范围内。由于您正在扩展对象,因此父对象和子对象的变量范围都是共享的,因此父对象中的
变量。id
与子对象中的变量相同。id
,子对象和父对象都可以访问或覆盖存储在其中的内容
此外,使用extend时,除非子函数read使用super.read()
显式调用父函数read
,否则永远不会调用它
另外,除非您已将应用程序和组件设置为使用ORM,否则
cfproperty
标记仅适用于Web服务。首先,garygilbert和KRC都有助于为我指明正确的方向。多谢各位
我收集了以下信息:
子变量和父变量都将共享相同的变量范围,因此在super中为variables.ID赋值时,子变量.ID值被覆盖
同样,由于OO函数重写,子函数read优先于父函数read
我的调整解决方案:
在调用超级函数之前,设置作为子ID的临时ID。
如果我将ID传递给init函数,read函数将自动调用,因此我希望避免在父对象中执行此操作,因为它仍然会调用子read。
我先调用Super.init(dsn)进行初始化,然后调用Super.setID(ID),最后调用Super.read()。超级调用之后,我恢复初始子ID
<cfscript>
variables.dsn = arguments.dsn;
variables.ID = arguments.ID;
variables.listID = arguments.listID;
variables.customFieldID = arguments.customFieldID;
if (variables.ID){
read();
if (variables.customFieldID){
variables.tempID = variables.ID;
Super.init(dsn=variables.dsn);
Super.setID(variables.customfieldID);
Super.read();
variables.ID = variables.tempID;
}
}
</cfscript>
variables.dsn=arguments.dsn;
variables.ID=arguments.ID;
variables.listID=arguments.listID;
variables.customFieldID=arguments.customFieldID;
if(variables.ID){
read();
if(变量.自定义字段ID){
variables.tempID=variables.ID;
Super.init(dsn=variables.dsn);
Super.setID(variables.customfieldID);
Super.read();
variables.ID=variables.tempID;
}
}
你能分享一些代码吗?此外,在父/子关系中,我不确定让child扩展parent是否可行。两者都可以扩展一个“基”对象,但不确定子对象扩展父对象是否可行;当你说read函数不执行时,我假设你指的是父函数中的init函数调用它自己的read。正如Gary所说,这个调用必须使用super来运行:两个cfc中都有init和read函数。我在“回答”中提供了最后的细节。谢谢@加里吉尔伯特:谢谢你的回复。我要指出
<cfscript>
variables.dsn = arguments.dsn;
variables.ID = arguments.ID;
variables.listID = arguments.listID;
variables.customFieldID = arguments.customFieldID;
if (variables.ID){
read();
if (variables.customFieldID){
variables.tempID = variables.ID;
Super.init(dsn=variables.dsn);
Super.setID(variables.customfieldID);
Super.read();
variables.ID = variables.tempID;
}
}
</cfscript>