2013-04-03 3 views
-3

У меня есть два класса B и C - оба являются монстрами в моей (очень примитивной) игре. У меня есть функция MOVE, которая на данный момент просто меняет координаты X и Y монстра. Оба B и C получены из A; поэтому A имеет координаты X и Y, а B и C имеют другие атрибуты, такие как скорость и атака.Использование одной и той же функции для обработки разных классов

Есть ли способ, которым я могу настроить одну функцию, которая позволит мне пройти либо B, либо C (поскольку они оба должны иметь возможность двигаться ...), другими словами, не имеет значения, монстр который перемещается, это B или C, но он будет обрабатывать их таким же образом?

Я думал о сдаче класса A, но я не могу заставить это работать! . :-((может быть, это только я, будучи крайне неопытный!)

Большое спасибо - :-)

KJ

+1

Какой язык вы с помощью? – kamituel

+0

Извините, забыли упомянуть, что я использовал C++. Это уже добавлено. Извинения за путаницу. – KingJohnno

+0

Это называется полиморфизм, и ваш первый инстинкт был, по крайней мере частично, правильным. Ваша функция должна быть реализована в терминах 'A', но для правильной работы вам необходимо передать ее в качестве ссылки (' A & ') или (менее предпочтительно) указателя (' A * '). – Chad

ответ

2

Реализовать движение в зависимости от а. Тогда и b, и c будут иметь функции перемещения, и затем вы можете использовать полиморфизм для перемещения как b, так и c как дочерних элементов a.

Для ответа, который является более точным, некоторый код действительно поможет, также, конечно, язык, который вы используете. То, как вы это описываете, некоторые вещи не звучат так, как будто они хорошо реализованы в отношении OO.

+0

Спасибо за ввод. Это мой первый настоящий «проект». Просто начать в мире C++. – KingJohnno

1

Использование можно реализовать move метод в родительском классе A:

class A { 
    private: 
    int X; 
    int Y; 

    public: 
    A() { X = 0; Y = 0; } 

    inline void move (int dx, int dy) { 
     X += dx; 
     Y += dy; 
     std::cout << "Moved to " << X << "," << Y << std::endl; 
    } 
}; 

class B : public A {}; 

class C : public A {}; 

Вы можете использовать эти классы:

A objB; 
A objC; 

objB.move(0,1); 
objB.move(0,3); 
objC.move(2,0); 

Этот код будет печатать:

Moved to 0,1 
Moved to 0,4 
Moved to 2,0 
+0

Это хороший ответ, но в этом контексте 'A' не _ абстрактно. Абстрактный класс имеет хотя бы одну виртуальную функцию _pure_. – Chad

+0

Это даже не компилируется. –

+0

@KerrekSB - true, я написал его без компиляции вначале, затем решил расширить его, чтобы сформировать полный класс. Даже сейчас я пропустил главный(), поскольку здесь дело не в этом. Но вы правы, я сделал это ясно, разделив два блока кода. – kamituel