2013-05-26 2 views
-2

Я решил попытаться вспомнить, что я узнал в своем объектно-ориентированном классе программирования пару лет назад, написав текстовую RPG-игру. Я не уверен, что я надеюсь когда-нибудь закончить работу, и мне все равно. Я просто хочу узнать, как писать программы.Участники против подклассов в OOP

Помня об основах работы функций, типов данных и классов в C++, я написал следующий код.

class Character 
{ 
     string Name; 

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

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

Теперь я хотел бы, чтобы у моих персонажей были расы. Первая идея заключалась в создании подклассов класса Character, по одному для каждой из разрешенных рас. Мне кажется, что это похоже на объектно-ориентированное программирование. Но я начал думать, как это будет работать. Я хотел бы сказать такие вещи, как «если Том - человек, Клара - орк, а Том и Клара пытаются выйти замуж, дать сообщение об ошибке». Я, вероятно, также хотел бы, чтобы люди и орки имели разные методы для разных вещей.

Мне кажется, что в первом случае я хочу рассматривать Гонку так, как если бы это был член (который я понимаю как атрибут) персонажа, а в первом, как если бы это был подкласс.

Является ли прежним даже возможным, если человек является подклассом персонажа? То есть, может ли объект узнать, в каком классе он находится?

И что мне делать и почему?

+0

http://en.wikipedia.org/wiki/Virtual_function Виртуальные функции в сочетании с подклассом - это, вероятно, то, что вы ищете. Вы можете использовать метод 'getRace()' или что-то подобное и соответствующим образом определить его для каждого класса. – cactus1

ответ

2

Эта проблема дизайна называется «специализация». В этом случае вы хотите, чтобы Race была атрибутом, а не подклассом, потому что поведение всех рас в принципе одинаково. В тех случаях, когда гонки придают особую способность справиться, что унифицированно по всем гонкам. Например, представьте себе только некоторые расы могут видеть в темноте, это то, как вы это делаете:

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

Мышление в C++ от Брюса Эккеля - это своего рода стандартная книга, и он объясняет вещи очень четко. Хорошо для абсолютных новичков и более опытных программистов. Кроме того, Design Patterns от Gamma - классика. «Практическая объектно-ориентированная конструкция в Ruby» от Metz - это новая книга, которая очень хороша в «философии» дизайна OO. (После того как вы закончите с этими книгами, вот вам совет: сбрасывать OO-программирование, это пустая трата времени. В конечном счете использование вашей собственной логики будет служить вам лучше. Парадигмы, подобные OO, - это просто отвлечение. de novo и, в конце концов, это окупится.) –

+0

@TylerDurden. С помощью «дампа» вы подразумеваете «полностью игнорировать», или вы имеете в виду «не слепо придерживаться»? Если вы имеете в виду последний, то определенно (OO - это просто инструмент, и, как любой инструмент, порой это просто не полезно). С другой стороны, если вы имеете в виду первое, то без каких-либо обоснованных аргументов это очень, очень смелое заявление. – Kitsune

Смежные вопросы