2014-04-08 85 views
0

我會用這個怪物「怪物」代碼Rust for Rubyist開始:鏽病性狀狀態

trait Monster { 
    fn attack(&self); 
    fn new() -> Self; 
} 

struct IndustrialRaverMonkey { 
    life: int, 
    strength: int, 
    charisma: int, 
    weapon: int, 
} 

struct DwarvenAngel { 
    life: int, 
    strength: int, 
    charisma: int, 
    weapon: int, 
} ... 
impl Monster for IndustrialRaverMonkey { ... 
impl Monster for DwarvenAngel { ... 

我擔心重複的代碼。在Java中,我將創建一個接口,該接口用所有參數定義attack方法和基類(life,strength,charisma,weapon)。我會用抽象類在C++中做同樣的事情。 我可以找到一些醜陋而不直觀的方法來解決這個問題,但有沒有減少代碼的好方法?我的意思是,保持它的可擴展性和可讀性。

回答

0

你會認爲這是一個可接受的解決方案嗎?

trait Actor { 
    fn attack(&self); 
} 

enum MonsterId { 
    IndustrialRaverMonkey, 
    DwarvenAngel 
} 

struct Monster { 
    life: int, 
    strength: int 
} 

impl Monster { 
    fn new(id: MonsterId) -> Monster { 
     match id { 
      IndustrialRaverMonkey => 
      Monster { life: 12, strength: 8 }, 

      DwarvenAngel => 
      Monster { life: 18, strength: 12 } 
     } 
    } 
} 


impl Actor for Monster { 
    fn attack(&self) {} 
} 

更新了一個更好的例子。

2

另一種方法,這有利於組成,並從其中如果需要的話更容易發散的實現(例如,CharacteristicsDwarvenAngel需要額外的字段):

trait Monster { 
    fn attack(&self); 
} 

struct Characteristics { 
    life: int, 
    strength: int, 
    charisma: int, 
    weapon: int, 
} 

struct IndustrialRaverMonkey { 
    characteristics: Characteristics 
} 

struct DwarvenAngel { 
    characteristics: Characteristics 
} 

fn same_attack(c: Characteristics) { 
    fail!("not implemented") 
} 

impl Monster for IndustrialRaverMonkey { 
    fn attack(&self) { 
     same_attack(self.characteristics) 
    } 
} 

impl Monster for DwarvenAngel { 
    fn attack(&self) { 
     same_attack(self.characteristics) 
    } 
} 

或者,你可以有一個枚舉代表你怪物類型,與AB的答案非常相似:

trait Monster { 
    fn attack(&self); 
} 

struct Characteristics { 
    life: int, 
    strength: int, 
    charisma: int, 
    weapon: int, 
} 

enum Monsters { 
    IndustrialRaverMonkey(Characteristics), 
    DwarvenAngel(Characteristics), 
} 

fn same_attack(_: &Characteristics) { 
    fail!("not implemented") 
} 

impl Monster for Monsters { 
    fn attack(&self) { 
     match *self { 
      IndustrialRaverMonkey(ref c) => same_attack(c), 
      DwarvenAngel(ref c)   => same_attack(c) 
     } 
    } 
} 
+0

出於興趣,爲什麼'〜特徵'在結構中,而不是'特徵'? (後者推薦,很少需要用'〜'來分配(小)結構。) – huon

+0

@dbaupp實際上,我仍然是一個noob。你是對的,那是一個小結構。我會修改我的答案。歡迎任何其他建議。 –

+0

據我所知,我必須實施派遣自己......這很有趣,我是rustnoob,並認爲還有一些其他的機制。 –