关于继承:Coldfusion – 覆盖使用关键字的基于标签的函数

Coldfusion - Overriding tag based functions that use keywords

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

1
2
3
4
5
6
7
8
9
10
11
12
<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(我个人的偏好


不幸的是,我认为没有什么好方法可以实现您想要的。但是,有一些解决方法。一个技巧是这样做:

1
2
3
4
5
6
7
component extends="OriginalComponent" {
  variables["do"] = function () {
    // new function code here
  };

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

它实际上并没有覆盖传统意义上的函数,但它似乎可以工作:在测试时,对函数的内部和外部调用都称为新函数,而不是原来的函数。

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


如果您真的不能使用 CFML,如果您的新 cfc 不需要进行类型检查,并且您不需要访问父级的私有变量,这可能会起作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
  }
}