我有一个简单的CFC类,它在Product-Product.cfc上处理CRUD。
我正在扩展类,以允许基于应用程序的其他属性-例如,CartProduct.cfc扩展了Product.cfc,以便允许包含一个Quantity属性。
在基类Product.cfc中,我首先传入一个ID,并在read()方法中使用ID从数据库中检索数据:
<cffunction name="read" returntype="Query">
<cfquery name="qData" datasource="mydb">
SELECT description
FROM mySKUTable
WHERE id = '#VARIABLES.Sku#'
</cfquery>
<cfreturn qData />
</cffunction>
<cffunction name="setSku" returntype="Product">
<cfargument name="Sku" type="String" required="true" />
<cfscript>
var qData = QueryNew("");
VARIABLES.Sku = ARGUMENTS.Sku;
qData = read();
VARIABLES.description = qData.description;
</cfscript>
</cffunction>我想在CartProduct.cfc中扩展它,以便使用read()方法从不同的表检索和设置数量:
<cffunction name="read" returntype="Query">
<cfquery name="qData" datasource="mydb">
SELECT quantity
FROM myCartTable
WHERE id = '#VARIABLES.Sku#'
</cfquery>
<cfreturn qData />
</cffunction>
<cffunction name="setSku" returntype="Product">
<cfargument name="Sku" type="String" required="true" />
<cfscript>
var qData = QueryNew("");
THIS = SUPER.setSku(Sku);
qData = read();
VARIABLES.quantity = qData.quantity;
</cfscript>
</cffunction>当我这样做时,只调用扩展的read()。这很好,这是按照设计的。但是,我正在寻找一种方法来调用read()方法,因此我可以首先在基类中设置属性,然后在扩展类中设置properties。
对此有什么想法吗?
附注:我知道我没有使用CFQUERYPARAM或验证我的输入,等等。为了保持这个简单,我忽略了那些垃圾,所以现在请不要给我那些建议。
发布于 2012-07-27 21:03:41
好吧,这是我想出来的:
我不是从read()方法返回查询,而是将查询行转换为Struct并返回Struct。这样,我就可以在read()中调用SUPER.read(),然后将父结构中的键和值复制到每个级别的新结构中。这是更多的代码,但它完成了工作。
<cffunction name="read" returntype="Struct" output="false">
<cfscript>
var _qData = QueryNew("");
var _properties = SUPER.read();
</cfscript>
<cfquery>
...
</cfquery>
<cfscript>
StructAppend(
_properties,
REQUEST.UDFLib.Query.queryRowToStruct(_qData)
);
return _properties;
</cfscript>
</cffunction>发布于 2012-07-28 18:53:47
您可以使用“超级”范围来引用扩展组件。因此,要从Product.cfc的CartProduct.cfc内部调用"read“方法,请调用Super.read()。
https://stackoverflow.com/questions/11695385
复制相似问题