从父方法调用重写的父方法

时间:2010-04-26 20:36:29

标签: coldfusion cfc

继承情况。组件B扩展组件A并覆盖init方法以接受不同的参数。 A还有create方法,可以调用init

如果我有一个B的实例并且我调用create,则调用错误的init - 它在B中调用init,我需要它在A中调用init。

我不想拨打super.init(),因为可能并不总是super。有没有办法指定在父组件中调用init?

3 个答案:

答案 0 :(得分:2)

将要执行的实际代码重构为自己的方法,并让Init方法调用该代码,并让create方法也调用该代码。

听起来你的物品目前设计得不好。尝试将您的方法分解为更小,更受约束的单位。

编辑:

我认为我的回答仍然存在。

如果父组件中的Init方法做了一些事情,那么将那些东西移动到一个新方法,比如“initDoStuff()”,并让init方法调用该方法。

然后,让你的create方法调用initDoStuff()方法而不是init。

ColdFusion是一种动态类型语言,您不需要重写方法只是为了接受不同的参数。你可以用其他方式做到这一点。

CF无法根据参数签名选择方法。所以,如果你遇到这种情况,你需要以不同的方式处理它。

基本上,重写一个方法来改变它的参数类型的想法在ColdFuion中并不真正有效。

组件A:

<cffunction name="init" access="public" output="false">
  <cfargument name=... ...>
  <cfreturn initDoSomething(argumentCollection=arguments)>
</cffunction>

<cffunction name="initDoSomething" access="package" output="false">
  {do stuff}
  <cfreturn {whatever}>
</cffunction>

组件B:                               

<cffunction name="create" access="package" output="false">
  <cfset {something} = initDoSomething({whatever arguments})>
  <cfreturn {whatever}>
</cffunction>

答案 1 :(得分:1)

调用基本初始化程序我不知道你正在运行什么语言但是在C#中它就是例如B b = new B():base(参数......)当然你还是要检查一下组件实际上是A或B类型,但您可以在大多数语言中执行此操作。

这也将运行扩展的初始化程序,但就是这样。如果你想摆脱扩展对象的初始化程序,你只需要创建一个我认为的父类型对象。这是我唯一能想到的。

但是,如果您指定了编程语言,那么它当然会有所帮助,以便了解选项和语法。

答案 2 :(得分:1)

我通过将create方法扩展为调用super.createsuper.init来解决此问题。仍然是对子init的调用失败了,但总的来说它有效。

我仍然更喜欢在父init上运行的解决方案,而不必覆盖create。