Интерфейсы шва, как лучший подход:
Концепция
Может быть сделать свой Weapon
класс немного более абстрактно: (. Атака, падение, т.д.) только основные методы, необходимые. Возможно, даже сделать его не абстрактным, чтобы он работал из коробки.
Теперь для специальной функциональности создайте некоторые интерфейсы, которые позволяют такие вещи, как бросок, стрелять, взрываться и т. Д. Таким образом, добавление новых функций в оружие будет намного проще и меньше времени.
Теперь, когда вызывается функция атаки, она может совершать совершенно разные виды атак, основанные на интерфейсах класса оружия.
Дизайн
Базовый класс:
//the general weapon class
public class Weapon{
//you don't want your base class instantiatable
protected Weapon(){}
public void attack(){
//take enemy health ect.
}
public void drop(){
//drop weapon
}
}
Что вы можете сделать с интерфейсами, делают обратный метод верно, если противник может ударить, или из метода вызова функции атаки если противник может быть поражен.
интерфейс Melee:
public interface Melee {
boolean onMelee();//called if the player tries to perform a melee attack
}
Стрелковое интерфейс:
public interface Ranged {
boolean onRanged();//called if the player tries to perform a ranged attack
}
лук класс оружие:
public class WeaponBow extends Weapon implements Ranged{
@Override
public boolean onRanged(){
//play animation, check if target is vulnerable, ect.
//return true if the enemy can be hit false otherwise
}
}
Теперь, когда игрок пытается использовать оружие, чтобы атаковать, приложение может проверьте, реализует ли класс оружия эти интерфейсы, а затем вызывает соответствующий метод.
Если класс оружия расширяет несколько интерфейсов, хороший способ выяснить, какое действие нужно предпринять, чтобы иметь выбор возможных действий, если игрок выбрал дальность, а затем попытайтесь выполнить предварительную атаку дальнего боя. Если игрок, например, выбрал рукопашную схватку, но это оружие дальнего боя, тогда следует вызвать стандартную или только другую доступную атаку.
Используйте Throwable Interface. – Luminous
Одно из возможных решений: забыть об абстрактном оружии, создать интерфейс 'MeleeWeapon' (с помощью метода' meleeAttack') и интерфейс 'RangedWeapon' (с помощью метода' rangedAttack'). Теперь класс может реализовать оба интерфейса. – Turing85
@ Turing85, я думал, что интерфейс может помочь здесь, но как я могу различать меч, который можно использовать в качестве оружия ближнего боя и копье, которое является оружием ближнего и дальнего боя? – Niminim