首先,我對「另一個接口問題」表示歉意。不過,我認爲這可能值得提問,因爲這是一個奇怪的問題。我正在使用的項目使用Actionscript 3,但這更多的是一個普通的OOP問題。如何避免重複使用與接口相同的實現代碼?
這裏的情況:
我已經從基類繼承的類;它是電子遊戲中的一個對象。 (假設它是一個宇宙飛船)。在我的遊戲中,我希望一次在屏幕上擁有許多許多太空飛船,所以我決定使用鏈表結構創建一個對象池。從邏輯上講,因爲Spaceship類已經從基類繼承,所以我將使用一個接口來定義與鏈表有關的方法。另外,這樣做可以讓我將這些方法擴展到其他類 - 例如類Asteroid,類Bullet或類Particle。
以下是問題 - 接口的優勢在於它可以讓您根據自己的需要爲您使用的每個類重新定義實現。但是對於像鏈表這樣的東西,代碼不會在類之間改變。由於我計劃擁有許多將實現這些對象池方法的類,我真的希望避免在每個新類中反覆使用相同的實現代碼。
問題:有沒有辦法避免重複使用每個班級使用的相同的確切鏈接列表代碼?或者這只是一個必然性?這似乎違反了一次又一次原則。是否可以在繼承塊中定義一個完整的函數,而不僅僅是它的原型?
如果這是一個愚蠢的問題,讓我知道。 (如果我問是否是這樣,那很可能是,但是,嘿,一會兒就不會愚蠢地學習。)似乎應該有更合乎邏輯的方式來做這樣的事情。
另外,如果你使用通用的基類方法,你還沒有失去多個實現的靈活性,因爲你的任何子類都可以覆蓋如果您需要它們,則實現鏈接列表行爲的函數。但是你可能不會經常這樣做,這就是爲什麼我認爲事物基類比接口更好的原因。 – 2011-04-15 00:11:00
是的。實際上,我正是想爲這個原因提供多重繼承,但是很多人似乎都討厭它。我不認爲這是邪惡的 - 它只是被誤解了。我不是Actionscript龐大的繼承樹的粉絲 - 我瞭解它的必要性,但我不喜歡這樣一個事實:爲了獲得我需要的一些方法,我必須在基類中插入一個基類。似乎是ActionScript 3的方式,但。 – 2011-04-15 00:27:12
另一個問題是,如果我確實擴展了Sprite或其他內置函數,那麼當我有不需要擴展任何Flash核心類的類時會發生什麼?我前一陣子在思考這個問題 - 我相信只有當你需要完整課程的全部功能時,你才應該繼承。我正在考慮使用基類*和*池的接口來實現一個默認實現,但它似乎有自己的一套問題(以及每種方法的單個問題)。我想我必須咬緊牙關並使用選項A.欣賞你的輸入 – 2011-04-15 02:58:16