2010-04-26 68 views
2

继承人的情况。组件B扩展组件A并覆盖init方法以接受不同的参数。 A还有一个create方法,它调用init从父方法调用重写的父方法

如果我有B的一个实例,并且我叫create,它调用了错误的init - 它在B,其中我需要它来调用初始化在A.调用init

我不想叫super.init()因为有可能并不总是super。有什么方法可以指定调用父组件中的init吗?

回答

1

我通过延伸create方法调用super.createsuper.init解决了这个。 theres仍然会调用失败的子init,但它总体上起作用。

我仍然更喜欢一个解决方案,它可以在父级init上工作,而不必重写create。

1

调用基础初始值设定项我不知道你正在运行什么语言,但在C#中它是例如B b = new B():base(parameters ...)当然,你仍然需要检查它该组件实际上是A型或B型,但您可以在大多数语言中使用该组件。

这也将运行扩展初始化器,但多数民众赞成在它的方式。如果你想摆脱扩展对象初始化器,你只需要创建一个我认为的父类型对象。这是我能想到的唯一的事情。

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

+0

它的ColdFusion,如标签 – Yisroel 2010-04-26 20:46:44

+0

啊我的坏在那里,对不起 – 2010-04-26 20:49:49

2

将您想要执行的实际代码重构为自己的方法,并让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> 
+0

有几个孩子的A.主要是覆盖init方法允许不同的方式来初始化,但然后他们调用super.init执行init对象。我想要执行的实际代码是父初始化方法,但我从父对象中的方法调用它,所以我不能使用super.init – Yisroel 2010-04-26 20:55:30

+0

,这肯定会解决它,但没有失败的目的?我可以将所有不同的init方法添加到具有不同名称的父对象。这就是我想要避免的。 – Yisroel 2010-04-26 21:17:47