2014-09-02 46 views
1

我問這個previous question有關coldfusion cfcs中的多繼承。現在,我有一個問題,這是否會模仿cfcs中的多重繼承,以及可能的缺點。我可以在一個單獨的文件中定義函數,然後將它們包含在多個cfc中以模擬多重繼承嗎?

假設我有這4個類:動物,馬,鳥,飛馬

  • 馬和鳥是動物的子類。
  • Pegasus是Horse的一個子類。
  • 但是,Pegasus的飛行方式與Bird類別的實例相同。

而不是在Bird類和Pegasus類中兩次相同地定義fly(),我可以在一個單獨的文件中定義它並將它包含在Pegasus和Bird的cfc中嗎?這樣做有什麼缺點嗎?

horse.cfc

<cfcomponent extends="animal"> 
     <!--- misc functions run, eat, whinny... ---> 
    </cfcomponent> 

bird.cfc

<cfcomponent extends="animal"> 
<cfinclude template="flier.cfm"> 
     <!--- misc functions hop, eat, chirp... ---> 
</cfcomponent> 

pegasus.cfc

<cfcomponent extends="horse"> 
<cfinclude template="flier.cfm"> 
</cfcomponent> 

flier.cfm

<cffunction name="fly"> 
<!--- flying action ---> 
</cffunction> 

我已經試過這段代碼,乍一看,它似乎爲我正在努力完成的工作,但由於它不是我提到的關於在CFC中多重繼承問題的解決方案,所以我希望得到一些反饋意見這是否是一個好方法。

+1

那麼,你有沒有試過看看會發生什麼?它看起來像你有很多樣本代碼設置。雖然可能有很好的理由使用另一種設計模式,但我可以確認可以通過include來混合使用UDF。這些UDF應該放在目標CFC的環境中,並分享它的變量和範圍。有些框架可以輕鬆包含UDF庫,而不依賴於繼承或組合或編織AOP方面。 – 2014-09-02 15:33:58

+0

嗯,是的,*在我給出的答覆(並且你接受了另一個問題)中提到了。第三段。這裏不是你確切的方法,但同樣的事情。 – 2014-09-02 16:04:19

+0

對於這個特定的例子,將fly()函數放入animal.cfc中似乎是實現您的目標的一種非常簡單的方法。話雖如此,我曾經寫過一個.net類庫,其中我必須具有可供多個類使用的功能。我使用的方法是創建一個HelperClasses項目。 CF等價物將創建cfc並在您的其他cfc中創建對象。但是,這與使用cfinclude非常類似,就像您在問題中提到的那樣。 – 2014-09-02 16:41:06

回答

2

是的,你所描述的將會起作用,並且是一種由於各種原因相對頻繁使用的技術。

這就是說,當你在這裏提出問題時,在你問他們是否會工作之前,嘗試一些事情,特別是如果他們很容易嘗試,是符合你最大利益的。一般來說,當你到這裏來問,你應該詞組您的問題爲:

  • 這是我的問題
  • 這是我已經試過
  • 這是我收到錯誤消息
  • 我在做什麼錯?
+0

我很抱歉。我確實嘗試過,而且它確實對我迄今爲止想要的功能起作用。然而,由於沒有人提到這是我以前的選擇的一個選項,我只是想知道這是一個實際的選擇,或者如果我只是挖了一個洞。我認爲將它簡單地附加到我原來的問題上是不對的,因爲我認爲這是一個單獨的問題。我編輯了我的問題,試圖澄清。我感謝你的意見。 – jessieloo 2014-09-02 15:58:09

+0

不需要道歉,請記住下次。 :) – 2014-09-05 15:19:08

1

想想這是我剛剛發佈到您最後一個問題的答覆的延續。同樣,WireBox已經具有一些稱爲「運行時混合」的功能,它類似於你所要求的功能。

http://wiki.coldbox.org/wiki/WireBox.cfm#Runtime_Mixins()

基本上,當您使用WireBox來創建你的對象,你可以指定組件上的註釋的UDF的文件,該文件將作爲公共方法。

// Via annotation 
component mixins="/helpers/base"{ 

} 

你可以有多個mixin文件,這個模擬多重繼承。如果你沒有發現它直接有用,你至少可以使用它的實現來獲得靈感。

完全披露:我是Box庫的貢獻成員。

相關問題