2013-04-10 69 views
1

我正在嘗試爲遊戲創建角色類。遊戲角色類的設計,繼承或組成?

關於字符類: - 它有不同的角色,例如戰士,射手,國王。 - 每個功能都有不同的屬性,例如攻擊,防禦。

我在這裏的問題是我應該使用繼承還是組合? 我有一個字符類,那麼我應該創建戰士類和擴展字符類,或者我應該只是在字符類中放置一個像字符串ID =「戰士」的標識符?

回答

6

我會做的是使用繼承的類+接口如果有一個屬性的組合的選項(例如,如果你有一個WarriorKing類)。

如果你想享受這兩種類型的特性在一些情況下,像WarriorKing你可以做這樣的事情:

class Character { ... } 

interface Warrior {...} 

interface King {...} 

abstract class KingImpl extends Character implements King 

abstract class WarriorImpl extends Character implements Warrior 

然後你把一切:

class WarriorKing extends Character implements Warrior, King { 
    private King kingImpl; 
    private Warrior warriorImpl; 

    public WarriorKing() { 
     kingImpl = new KingImpl(); 
     warriorImpl = new WarriorImpl(); 

    } 

現在讓我們說Warrior接口中有一個方法kill(),需要由每個實現類實現(WarriorKing必須實現它),並且已經在抽象WarriorImpl類中實現,您可以執行如下操作:

class WarriorKing extends Character implements Warrior, King { 
    private King kingImpl; 
    private Warrior warriorImpl; 

    public WarriorKing() { 
     kingImpl = new KingImpl(); 
     warriorImpl = new WarriorImpl(); 

    } 

    public void kill() { 
     this.warriorImpl.kill() 
    } 

} 

這樣你就可以享受所有的世界,讓所有的東西都實現一次,擁有模塊化的課程設計,你可以享受任何你可能需要的角色組合。祝你好運!

0

我認爲,在模塊化設計和(後來的)複雜性方面提供了最佳的解決辦法是擴展基類,你可以使用只有「勇士」接口或只是「射手」等

並認爲添加不同的方法或屬性,只需要爲特定的字符(現在或稍後)設置。

希望這會有所幫助。

最佳,

0

如果所有角色共享某些屬性,那麼我將有一個字符類所述性質和有每種特定性格的人將擴展字符,並添加自己的特定屬性。

+0

但是,如果兩個或更多的類具有相同的(重疊但不是子集的)擴展名,那麼您將最終得到重複的代碼。 – 2013-04-10 16:49:59

+0

我不確定您的擴展名是什麼意思。如果在Character類中考慮到所有常見的「特徵」,則不應該有重複的代碼。任何僅限於特定類型角色的人,比如戰士,都將屬於同類。 – Tom 2013-04-10 17:28:25

0

字符串ID =「戰士」聽起來像「stringly類型編程」,你應該避免。

經驗法則是,類層次結構不宜深(不超過3或4級)。

我會定義一個基類(漢字)和一些派生類(戰士,精靈等),但不會去任何更深:

  • 字<戰士< AxeWarrior
  • 字符<嚮導< LightWizard
  • 字<嚮導< EvilWizard

看起來你的角色具有不同的屬性,但具有基本相同的行爲(攻擊,防禦等)。但是攻擊和防守的手段是不同的(一個戰士會哈希和斜線,一個巫師會拼出一個魔法)。這是繼承和多態性的好選擇。

0

如果角色有相同屬性的值不同,那麼你不應該創建不同的類,但如果戰士作爲一個整體可以做的事情/有不同的特性,其他人不能,那麼是的。例如:如果戰士對於屬性「強度」具有不同於魔術師的價值,那麼在這種情況下,不需要爲每個戰士創建子類,因爲它們在概念上是相同的。然而,如果魔術師可以飛,那麼你應該。

1

我喜歡這樣做的方式是寫出你想要的每個類的所有屬性和參數。查看哪些參數在類中共享,並決定如何處理它。

既然你已經有了一個Character類,決定你想要Character的實際子類有多不同。

你還可以做的是對不同的類使用不同的Interfaces。接口將具有特定類的唯一方法。

不要猶豫,只是爲了它,它如何處理它並不重要,但接口和繼承確保您的代碼更易於理解。祝你好運!

0

對於像「戰士」,「國王」或「射手」這樣的東西,我會使用「角色」一詞而不是類,只是爲了避免與Java類混淆。

我不認爲子類或接口很適合這裏,它們在設計中引入了太多的剛性。深層的類層次結構也變得複雜。

想想角色(意思是「角色班」)通常會做什麼。他們爲角色提供了一些能力,能力,技能等等的初始值,並且當角色改善時,他們確定哪些東西會改善多少。爲了所有其他目的,您可以在不引用角色的情況下通過他們的能力來定義角色。所以你不必嚴格需要爲此子類。

此外,您可能不打算立即允許多個角色或角色轉換,但爲什麼要讓自己陷入困境?使用繼承是非常有限的,因爲你不能擴展多個類,如果你可能會遇到其他問題。

我會有一個Character類,但不能根據角色進行子類化。相反給角色一個角色列表,其中每個角色可以被分類(所有射手都是戰士,或者其他)。這種方式比使用類或接口更靈活,可以輕鬆管理多個角色以及在遊戲過程中更改或添加角色。