У меня есть два класса; давайте назовем их Огром и Волшебником. (Все поля являются общедоступными, чтобы упростить ввод примера).
public class Ogre
{
int weight;
int height;
int axeLength;
}
public class Wizard
{
int age;
int IQ;
int height;
}
В каждом классе я могу создать метод, называемый, скажем, battle (), который будет определять, кто победит, если Огр встретится и Огр или Волшебник встретит Волшебника. Вот пример. Если огр встречает огра, побеждает более тяжелый. Но если вес такой же, побеждает тот, у кого топор длиннее.
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;
}
И мы бы сделали аналогичный для Огров, которые встречают Волшебника. Но все выходит из-под контроля, если нам нужно добавить больше типов символов в программу.
Это то место, где я застреваю. Одним из очевидных решений является создание класса Character с общими чертами. Огр и Волшебник наследуют от Персонажа и расширяют его, чтобы включить другие черты, которые определяют каждый из них.
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;
}
}
Есть ли лучший способ организовать занятия? Я посмотрел на шаблон стратегии и шаблон посредника, но я не уверен, как кто-то из них (если есть) мог бы помочь здесь. Моя цель состоит в том, чтобы достичь какого-то общего метода битвы, чтобы, если Огр встречает Огра, он использует битву Огр-против-Огре, но если Огр встречает Волшебника, он использует более общий метод. Кроме того, что если встречающиеся персонажи не имеют общих черт? Как мы можем решить, кто выиграет битву?
Редактировать: много отличных ответов! Мне нужно переварить их и выяснить, какой из них лучше всего подходит для моей ситуации.