通过ColdFusion中的组件继承进行公共 - 私有功能访问

时间:2014-11-30 14:53:56

标签: function inheritance coldfusion encapsulation cfml

我遇到ColdFusion标记语言的意外问题。假设我有以下组件。如果公共和私有函数都在“基础”组件中定义,那么前者在从扩展“子”类型的实例调用时是否仍然可以调用私有函数?

Program.cfc

<cfcomponent>

    <cffunction access="public" name="doOperation"> 
        <cfset this.checkValue(-14)>
    </cffunction> 


    <cffunction access="private" name="checkValue">
        <cfargument name="notNeg" required="yes" type="numeric">

        <cfif arguments.notNeg LT 0 >
            <cfthrow message="Negative Numbers not allowed"> 
        </cfif>
    </cffunction> 

 </cfcomponent>

SubProgram.cfc

<cfcomponent extends="Program">

</cfcomponent>

Run.cfm

 <cfobject component="SubProgram" name="this.instance">

 <cfset this.instance.doOperation()>                      <<<<----ERROR---->>>>

ColdFusion抛出错误

  在组件checkValue中找不到

方法SubProgram。确保定义了方法......

这是什么问题?封装没有布朗尼点!

1 个答案:

答案 0 :(得分:4)

问题是您尝试将checkValue()方法称为 public 方法。 this在CFML中的工作方式与在其他语言中的工作方式不同(Macromedia的设计决策非常糟糕):this是对象本身的外部引用,所以如果你调用this.someMethod(),它正在尝试调用名为public的{​​{1}}方法(就像您正在调用someMethod()一样)。在CFML的说法中,myObject.someMethod()范围是对私有数据/成员的引用。

你想要做的是:

variables

或者简单地说:

<cffunction access="public" name="doOperation"> 
    <cfset variables.checkValue(-14)>
</cffunction> 

另外,如果您使用的是最新版本的CF(例如:CF10或CF11),您真的不想在标签中编写组件。这使得代码非常糟糕。尝试限制标记使用以查看文件。 CF10仍然没有100%支持脚本中的所有CFML结构,但CF11确实如此。