У меня есть два класса; позвольте назвать их Огре и Волшебником. (Все поля являются общедоступными, чтобы упростить ввод примера.)
public class Ogre
{
int weight;
int height;
int axeLength;
}
public class Wizard
{
int age;
int IQ;
int height;
}
В каждом классе я могу создать метод, называемый, например, battle(), который определит, кто победит, если встретится Ogre, а Ogre или Мастер встретит Мастер. Вот пример. Если Огре встречает Огра, побеждает более тяжелый. Но если вес тот же, выигрывает тот, у которого более длинный топор.
public Ogre battle(Ogre o)
{
if (this.height > o.height) return this;
else if (this.height < o.height) return o;
else if (this.axeLength > o.axeLength) return this;
else if (this.axeLength < o.axeLength) return o;
else return this; // default case
}
Мы можем сделать аналогичный метод для Wizards.
Но что, если Мастер встречает Огра? Разумеется, мы могли бы сделать метод для этого, сравнивая, скажем, только высоты.
public Wizard battle(Ogre o)
{
if (this.height > o.height) return this;
else if (this.height < o.height) return o;
else return this;
}
И мы сделаем аналогичный для Ogres, которые встречают Wizard. Но все выходит из-под контроля, если нам нужно добавить в программу больше типов символов.
Вот где я застрял. Одним из очевидных решений является создание класса Character с общими чертами. Ogre и Wizard наследуют от персонажа и расширяют его, чтобы включить другие черты, которые определяют каждый из них.
public class Character
{
int height;
public Character battle(Character c)
{
if (this.height > c.height) return this;
else if (this.height < c.height) return c;
else return this;
}
}
Есть ли лучший способ организовать классы? Я рассмотрел шаблон стратегии и шаблон посредника, но я не уверен, как может помочь любой из них (если есть). Моя цель состоит в том, чтобы достичь своего рода обыденного метода боя, так что, если Огре встречает Огре, он использует битву Огре-против-Огра, но если Огре встречает Волшебника, он использует более общий. Кроме того, что, если персонажи, которые встречаются, не имеют общих черт? Как мы можем решить, кто победит в битве?
Изменить: много замечательных отзывов! Мне нужно переварить их и выяснить, какой из них лучше всего подходит для моей ситуации.