Другой ответ напрямую касается вопроса в вопросе. Как вы можете видеть, используя этот дизайн, лучший вариант для вас - это использовать кучу equipXXX()
методов.
Альтернативой может быть использование шаблона декоратора .
Создание абстрактных Weapon
и WeaponDecorator
для обеспечения максимальной гибкости при последующем добавлении новых типов оружия.
public abstract class Weapon {
...
}
public abstract class WeaponDecorator extends Weapon {
Weapon _weapon;
WeaponDecorator(Weapon weapon) {this._weapon = weapon;}
}
Преобразование различных типов оружия в качестве декораторов оружия:
public class OneHanded extends WeaponDecorator {
OneHanded(Weapon weapon) {
super(weapon);
}
}
public class Melee extends WeaponDecorator {
Melee(Weapon weapon) {
super(weapon);
}
}
и удалите все дженерики из класса Warrior
:
public class Warrior {
private Weapon weapon;
public void equip(Weapon weapon) {
this.weapon = weapon;
}
}
Теперь вы можете просто сделать:
Weapon w = new OneHanded(new Melee(new Dagger()));
Warrior warrior = new Warrior();
warrior.equip(w);
Вот полный пример с кодом и дополнительными пояснениями.
РЕДАКТИРОВАТЬ :
Если вы выберете это решение, ответственность за проверку достоверности выбранного оружия для выбранного героя также должна быть рассмотрена в время выполнения. Например, это можно добавить к методу Ranger
equip
:
if(weapon.isMelee()) //error (unacceptable)
Но поскольку набор правил становится сложным, вы можете использовать другие шаблоны, такие как команда рисунок . Тем не менее, все это будет делегировано во время выполнения. Это цена, которую вы платите за приобретение большей гибкости. Конечно, вы также можете попытаться добиться некоторой безопасности во время компиляции, создав иерархию декораторов (аналогично тому, что делает библиотека java .io). Однако это может сделать приложение слишком сложным и очень быстрым.
В конце концов, если есть только несколько из этих комбинированных типов (TwoHanded + Melee
, OneHanded + Ranged
и т. Д. c), имеет смысл go с другим ответом и просто есть еще несколько equip
методов и безопасность проверки типов во время компиляции.