4

首先,我對「另一個接口問題」表示歉意。不過,我認爲這可能值得提問,因爲這是一個奇怪的問題。我正在使用的項目使用Actionscript 3,但這更多的是一個普通的OOP問題。如何避免重複使用與接口相同的實現代碼?

這裏的情況:

我已經從基類繼承的類;它是電子遊戲中的一個對象。 (假設它是一個宇宙飛船)。在我的遊戲中,我希望一次在屏幕上擁有許多許多太空飛船,所以我決定使用鏈表結構創建一個對象池。從邏輯上講,因爲Spaceship類已經從基類繼承,所以我將使用一個接口來定義與鏈表有關的方法。另外,這樣做可以讓我將這些方法擴展到其他類 - 例如類Asteroid,類Bullet或類Particle。

以下是問題 - 接口的優勢在於它可以讓您根據自己的需要爲您使用的每個類重新定義實現。但是對於像鏈表這樣的東西,代碼不會在類之間改變。由於我計劃擁有許多將實現這些對象池方法的類,我真的希望避免在每個新類中反覆使用相同的實現代碼。

問題:有沒有辦法避免重複使用每個班級使用的相同的確切鏈接列表代碼?或者這只是一個必然性?這似乎違反了一次又一次原則。是否可以在繼承塊中定義一個完整的函數,而不僅僅是它的原型?

如果這是一個愚蠢的問題,讓我知道。 (如果我問是否是這樣,那很可能是,但是,嘿,一會兒就不會愚蠢地學習。)似乎應該有更合乎邏輯的方式來做這樣的事情。

回答

2

在其他支持多重繼承的語言中,有一種簡單的方法可以在不需要所有遊戲對象具有共同祖先的情況下完成它:您的宇宙飛船可以繼承基礎船類以及鏈表元素類。不幸的是,AS3不支持多重繼承,所以你必須選擇是:

A.使用的接口完全按照你的建議

B.讓所有的遊戲對象的基類繼承一個實現鏈表功能並擴展Sprite(或MovieClip)的共同祖先,而不是直接擴展Sprite或MovieClip的遊戲對象基類。

我可能會去與後者,以解決您的確切問題。我可能派生自Sprite或MovieClip,並將其稱爲GamePoolObject或其他類似的東西...

+0

另外,如果你使用通用的基類方法,你還沒有失去多個實現的靈活性,因爲你的任何子類都可以覆蓋如果您需要它們,則實現鏈接列表行爲的函數。但是你可能不會經常這樣做,這就是爲什麼我認爲事物基類比接口更好的原因。 – 2011-04-15 00:11:00

+0

是的。實際上,我正是想爲這個原因提供多重繼承,但是很多人似乎都討厭它。我不認爲這是邪惡的 - 它只是被誤解了。我不是Actionscript龐大的繼承樹的粉絲 - 我瞭解它的必要性,但我不喜歡這樣一個事實:爲了獲得我需要的一些方法,我必須在基類中插入一個基類。似乎是ActionScript 3的方式,但。 – 2011-04-15 00:27:12

+0

另一個問題是,如果我確實擴展了Sprite或其他內置函數,那麼當我有不需要擴展任何Flash核心類的類時會發生什麼?我前一陣子在思考這個問題 - 我相信只有當你需要完整課程的全部功能時,你才應該繼承。我正在考慮使用基類*和*池的接口來實現一個默認實現,但它似乎有自己的一套問題(以及每種方法的單個問題)。我想我必須咬緊牙關並使用選項A.欣賞你的輸入 – 2011-04-15 02:58:16

0

我從來不喜歡使用接口。
我要做的是創建另一個基類
第一個類將是基類讓我們稱之爲SpaceObject。所有空間物體都具有質量,速度,摩擦力(如果有的話),旋轉屬性。 SpaceObject也將擴展UI組件,因爲我們希望它最終被添加到顯示列表中,並且具有用於命中檢測的繼承方法會很好。
它還將具有處理移動和其他空間物體所需的任何方法。
然後任何時候我想創建一個新的空間對象,我只想擴展SpaceObject類。
公共類SpaceShip擴展SpaceObject或
公共類Commet擴展SpaceObject。
這些類將繼承SpaceObjects屬性,並且具有它們自己的效果,比如尾部有多長或有什麼武器。它們應該被封裝來處理與它們相關的任何事情

+0

接口有其位置,因爲當您需要實際接口時有多種實現方式:例如,您可以創建一個管理與遊戲服務器的通信並通過IGameServerConnection接口將其提供給遊戲客戶端的類,那麼你可以創建一個虛擬服務器來進行離線測試,該服務器實現相同的接口但假裝服務器響應。我只是不認爲這是這種情況的最佳解決方案 - 我同意你的看法,它是所需的基類公共行爲,它不會向我尖叫「接口」,而是多重繼承。 – 2011-04-15 01:43:42