Coldfusion - 覆盖使用关键字的基于标记的函数

时间:2013-07-03 20:56:40

标签: inheritance coldfusion

我目前正在尝试扩展第三方CFC,它一切正常并正常工作,但是,我现在已经覆盖了CFC中的一种方法(我首先扩展它的全部原因) 。现在第三方CFC都是基于标签的,并且有一个名为“do”的函数 - 定义如下:

<cffunction name="do" returntype="any" access="public" output="true" 
                hint="I compile and execute a specific fuseaction.">
        <cfargument name="action" type="string" required="true" 
                    hint="I am the full name of the requested fuseaction (circuit.fuseaction)." />
        <cfargument name="contentVariable" type="string" default="" 
                    hint="I indicate an attributes / event scope variable in which to store the output." />
        <cfargument name="returnOutput" type="boolean" default="false" 
                    hint="I indicate whether to display output (false - default) or return the output (true)." />
        <cfargument name="append" type="boolean" default="false" 
                    hint="I indicate whether to append output (false - default) to the content variable." />
        <cfargument name="passThroughReturn" type="boolean" default="false" 
                    hint="I indicate whether to allow for a return to be passed through from an action CFC." />

现在,我的CFC都是cfscript(我的个人偏好和项目编码标准)。如果我尝试在我的CFC中覆盖此方法,如下所示:

public any function do( Required String action, String contentVariable="", boolean returnOutput=false, boolean append=false, boolean passThroughReturn=false){

然后我得到一个关于函数名的错误,因为“do”是一个CF保留字。

我试图通过重命名方法并只映射它来解决这个问题,例如:

this.do = variables.invokeDo;

public any function invokeDo( Required String action, String contentVariable="", boolean returnOutput=false, boolean append=false, boolean passThroughReturn=false){

这可以解决错误,但如果我调用myObject.do(..),它只会调用超类方法。

有谁知道如何在CFscript中覆盖此方法?

2 个答案:

答案 0 :(得分:1)

不幸的是,我认为没有一种好方法可以达到你想要的效果。但是,有一些解决方法。一个黑客就是这样做:

component extends="OriginalComponent" {
  variables["do"] = function () {
    // new function code here
  };

  this["do"] = variables["do"];
}

实际上实际上覆盖了传统意义上的功能,但似乎才能工作:在测试时,内部和外部调用该函数称为新功能,而不是原始。

这种黑客可能会有其他后果,我不知道,所以要小心。

答案 1 :(得分:0)

如果你真的不能使用CFML,如果你的新cfc不需要被打字检查,并且你不需要访问父的私有变量,这可能会有用。

component {

  function init(parent) {
    variables.parent = parent;
    return this;
  }

  function onMissingMethod(missingMethodName, missingMethodArguments)
  {
    if (missingMethodName == "do")
      doFunc();
    else {
      // if CF10, use invoke(), else use yucky evaluate()
    }
  }

  function doFunc()
  {
     // your new do() function
  }
}