繼承人的情況。組件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