2013-02-17 96 views
6

我正在寫一個簡單的遊戲和很多遊戲對象共享屬性。我有兩個潛在的實現。在這種情況下,我應該使用繼承還是組合?

第一個如下圖中指定使用繼承:

Class Hierarchy

加粗類是抽象類,如您所想。分支是實際使用的派生類。需要注意的是,這些類包含有關對象的數據,並沒有與它們相關的功能。例如,部隊和車輛有一個共同的界面,他們都用來做攻擊()和移動()等事情。上面概述的類層次結構只是原始統計信息。而且,它們都是真正的ISA關係。

第二個實現使用組合。而不是上面的類層次結構,每個抽象類都是保存某些數據成員的「模塊」。所以SpecialAbility有一個名爲PointsValueObject的數據成員(雖然我改變了抽象的名字(儘管它們不再是抽象的),以反映它們的模塊化/屬性性質)。 Troop有數據成員:PointsValueObject,PhysicalObject,PhysicalAttackObject和BattleOBject,每個模塊都包含關於部隊的數據。同樣,這些模塊中不存在功能,它們僅用於存儲數據。行爲和功能仍然通過接口類來實現。

我的問題是這樣的:人們一般喜歡在組成繼承,但在這種情況下,我傾向於堅持繼承,因爲ISA關係保持和層次結構中不包含的行爲,唯一的數據。這個層次結構是不是很好的OOD,還是使用屬性'modules'更好地構建類?

+1

的「模塊」的方法是類似的部件基於[實體系統(http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of -mmog-development-part-1 /)通常用於遊戲開發。它牽涉到一些額外的複雜性,但它對於可重用性和可擴展性非常好。我不知道哪種方法會更好,每種方法都有其優點和缺點,但是取決於你的平衡,並決定哪種方法適合你的問題。 – asermax 2013-02-17 19:50:30

回答

4

如果沒有代碼被重用,您在使用繼承時會看到什麼優勢?繼承是DRY(不要重複自己)時的行爲是一樣的,但沒有行爲你正在做的是可能限制自己有用 - 如果日後您有需要更少的數據的子層次,有沒有一個很好的解決方案爲了做到這一點。

+0

對不起,DRY是什麼意思? – Slims 2013-02-17 19:56:14

+0

不要重複自己 – KidTempo 2013-02-17 20:00:59

相關問題