2013-05-26 3 views
-2

저는 몇 년 전에 텍스트 기반 RPG 게임을 작성하여 객체 지향 프로그래밍 클래스에서 배운 것을 기억하기 위해 노력했습니다. 나는 그 일을 끝내기를 바라고 있으며 나는 너무 걱정하지 않는다. 난 그냥 프로그램을 작성하는 법을 다시 배우고 싶다.OOP의 멤버와 서브 클래스

함수, 데이터 유형 및 클래스가 C++에서 작동하는 방법의 기본 사항을 기억하고 나서 다음 코드를 작성했습니다.

class Character 
{ 
     string Name; 

public: 
     Character() 
     { 
      Name = "Charname"; 
     } 

     string GetName(){return Name;} 
     void SetName(string sName){Name=sName;} 
}; 

이제 캐릭터에 경주가 있기를 바랍니다. 첫 번째 아이디어는 허용 된 레이스마다 하나씩 Character 클래스의 하위 클래스를 만드는 것이 었습니다. 이것은 나에게 객체 지향 프로그래밍에서 할 일을 좋아하는 것 같습니다. 그러나 그것이 어떻게 작동하는지 생각하기 시작했습니다. "톰이 인간이라면 클라라는 오크이고 톰과 클라라는 결혼하려고 시도하고 오류 메시지를 전합니다."라고 말할 수 있기를 바란다. 아마도 인간과 오크가 다른 일을하는 데있어 다른 방법을 사용하기를 바랍니다.

전적으로 나는 레이스를 캐릭터의 회원 인 (나는 속성으로 이해함) 인 것처럼 취급하고, 전자에서는 레이스가 마치 서브 클래스.

인간이 Character의 하위 클래스 인 경우 전자가 가능합니까? 즉, 객체가 어떤 클래스에 있는지 알 수 있습니까?

내가해야하는 이유는 무엇입니까?

+0

http://en.wikipedia.org/wiki/Virtual_function 서브 클래 싱과 함께 가상 함수가 아마도 당신이 찾고있는 것일 것입니다. 'getRace()'또는 이와 유사한 메소드를 사용하여 각 클래스에 대해 적절하게 정의 할 수 있습니다. – cactus1

답변

2

이 디자인 문제를 "전문화"라고합니다. 이 경우 모든 레이스의 동작이 근본적으로 동일하기 때문에 레이스가 하위 클래스가 아닌 특성이되어야합니다. 인종이 특별한 능력을 부여하는 경우 모든 인종의 통일 된 방식으로이를 처리합니다. 예를 들어, 일부 종족은 당신이 그것을 할 방법이은, 어둠 속에서 볼 수있는 상상 : 그 라인을 따라

int getVisionRange(int iCurrentLightLevel){ 
    if(iCurrentLightLevel < LightLevel.DIM){ 
     if(this.race == ORC || this.race == ELF){ 
      return VisionRange.GOOD; 
     } else { 
      return VisionRange.NONE; 
     } 
    } else { 
     return MAX_VISION_RANGE; 
    } 
} 

또는 무언가를.

+0

감사합니다. 이 문제를 자세히 설명하는 텍스트를 참조 할 수 있습니까? 나는 단지 그것을 봤다. 그리고 나는 약간의 설명을 본다. 그러나 그들은 보통 짧다. 예제를 통해 접근 가능한 개요가 있습니까? 여기 어딘가에 회색 영역이 있어야하며, 내가 읽을 수 있다면 좋을 것 같습니다. –

+0

브루스 에켈 (Bruce Eckel)이 C++로 생각하는 것은 표준 책의 일종이며 그는 일을 매우 분명하게 설명합니다. 절대 초보자와 경험 많은 프로그래머에게 좋습니다. 또한 감마의 디자인 패턴은 고전적입니다. Metz의 "루비에서 실용적인 객체 지향 디자인"은 OO 디자인의 "철학"에 매우 좋은 새로운 책입니다. (이 책을 다 읽고 나면, 팁이 있습니다. 시간 낭비입니다. 오랫동안 자신의 논리를 사용하면 더 효과적 일 것입니다 .OO 같은 패러다임은 산만 함입니다. 각 문제를 해결하십시오. 드 노보 그리고 결국에는 갚을 것이다.) –

+0

@TylerDurden "덤프"는 '완전히 무시한다'는 의미입니까, 아니면 '맹목적으로 고수하지 않는'것을 의미합니까? 당신이 후자를 의미한다면, 분명히 (OO는 단지 도구 일뿐 아니라 어떤 도구와 마찬가지로 때때로 유용하지 않다). 반면에, 만약 당신이 전 (前者)을 의미한다면, 매우 강력한지지 이유없이 매우 대담한 진술입니다. – Kitsune