Inheritance 继承的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

我有两个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结构,并使该功能按预期工作

提前谢谢

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