继承人的情况。组件B扩展组件A并覆盖init
方法以接受不同的参数。 A还有一个create
方法,它调用init
。从父方法调用重写的父方法
如果我有B的一个实例,并且我叫create
,它调用了错误的init
- 它在B,其中我需要它来调用初始化在A.调用init
我不想叫super.init()
因为有可能并不总是super
。有什么方法可以指定调用父组件中的init吗?
继承人的情况。组件B扩展组件A并覆盖init
方法以接受不同的参数。 A还有一个create
方法,它调用init
。从父方法调用重写的父方法
如果我有B的一个实例,并且我叫create
,它调用了错误的init
- 它在B,其中我需要它来调用初始化在A.调用init
我不想叫super.init()
因为有可能并不总是super
。有什么方法可以指定调用父组件中的init吗?
我通过延伸create
方法调用super.create
和super.init
解决了这个。 theres仍然会调用失败的子init,但它总体上起作用。
我仍然更喜欢一个解决方案,它可以在父级init上工作,而不必重写create。
调用基础初始值设定项我不知道你正在运行什么语言,但在C#中它是例如B b = new B():base(parameters ...)当然,你仍然需要检查它该组件实际上是A型或B型,但您可以在大多数语言中使用该组件。
这也将运行扩展初始化器,但多数民众赞成在它的方式。如果你想摆脱扩展对象初始化器,你只需要创建一个我认为的父类型对象。这是我能想到的唯一的事情。
但是,当然,如果您指定了您正在编程的语言,以便了解选项和语法,这当然会有所帮助。
将您想要执行的实际代码重构为自己的方法,并让Init方法调用该代码,并让create方法调用该代码。
这听起来像你的物体目前设计不好。尝试将您的方法分解为更小,更受限制的单元。
编辑:
我想我的答案仍然存在。
如果父组件Init方法做一些事情,将这些东西以一种新的方法,比如,“initDoStuff(),并有init方法调用该方法。
然后,让你的打造方法调用initDoStuff()方法,而不是初始化。
的ColdFusion是一种动态类型语言,你不需要重写方法只接受不同的参数,你可以做到这一点在其他方面。
CF ISN无法根据参数签名选择方法,所以如果你有这样的情况,你需要在广告中处理它不同的方式。
基本上,覆盖方法来改变它的参数类型的想法在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>
它的ColdFusion,如标签 – Yisroel 2010-04-26 20:46:44
啊我的坏在那里,对不起 – 2010-04-26 20:49:49