我遇到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
。确保定义了方法......
这是什么问题?封装没有布朗尼点!
答案 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确实如此。