情况如下。组件 B 扩展组件 A 并覆盖该init
方法以接受不同的参数。A 也有一个create
调用init
.
如果我有一个 B 的实例并且我调用create
它,它调用错误init
- 它在 B 中调用 init,我需要它在 A 中调用 init。
我不想打电话super.init()
,因为可能并不总是有super
. 有没有办法指定在父组件中调用init?
情况如下。组件 B 扩展组件 A 并覆盖该init
方法以接受不同的参数。A 也有一个create
调用init
.
如果我有一个 B 的实例并且我调用create
它,它调用错误init
- 它在 B 中调用 init,我需要它在 A 中调用 init。
我不想打电话super.init()
,因为可能并不总是有super
. 有没有办法指定在父组件中调用init?
将您要执行的实际代码重构为它们自己的方法,并让 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>
调用基本初始化程序我不知道你正在运行什么语言,但在 C# 中它是例如 B b = new B() : base(parameters...) 当然你仍然需要检查组件是否在A 或 B 类型的事实,但您可以在大多数语言中做到这一点。
这也将运行扩展的初始化程序,但就是这样。如果你想摆脱扩展对象初始化器,我认为你只需要创建一个父类型对象。这是我唯一能想到的。
但是,如果您指定您正在编程的语言当然会有所帮助,以便了解选项和语法。
我通过将create
方法扩展为调用super.create
和来解决这个问题super.init
。仍然有一个调用失败的子初始化,但总的来说它有效。
我仍然更喜欢在父 init 上工作而不必覆盖创建的解决方案。