2010-04-26 66 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