2014-04-08 2 views
0

는 :녹 특성 상태

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에서 나는 모든 매개 변수 (life, strength, charisma, weapon)와 함께 attack 메서드와 기본 클래스를 정의하는 인터페이스를 만들 것입니다. 나는 추상 클래스로 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

구성을 선호하고, 필요에있는 구현을 분기하는 것이 더 쉽습니다 또 다른 방법 (예를 들어, DwarvenAngel에 대한 Characteristics는 추가 필드가 필요) : 당신이 열거 대표 가질 수

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 포인터에 관해서는 여전히 멍청하다. 네가 맞아, 그건 작은 구조체 야. 나는 내 대답을 고칠 것이다. 다른 제안 사항은 환영합니다. –

+0

제가 이해 하듯이, 저는 스스로 파견을 시행해야합니다 ... 흥미 롭습니다. 나는 녹슨하고 다른 잘못된 메커니즘이 있다고 생각합니다. –