我正在研究我的java项目,这是一个基本的角色扮演游戏,我有一个OOD问题(我猜它很简单,但这是我的第一个java项目)。我开始研究武器,我用一个名为attack的抽象方法创建了一个抽象的Weapon类。武器有两个子类 - MeleeWeapon和RangedWeapon,两者都有攻击方法,没关系。
然后我想到了另一件事 - 如果像长矛这样的近战武器对象可以用于近战并且也可以被抛出会发生什么?在这种情况下,什么是一个好的解决方案?
答案 0 :(得分:3)
一种选择是使用合成而不是继承。
每种武器都可以提供一系列攻击。例如,Weapon.getAttacks()
返回一组受支持的攻击。在子类中,Spear.getAttacks()
返回Thrust
,Throw
和BashBashBash
的实例。
这允许您对多种武器使用相同的攻击。狼牙棒和长矛都可以提供Bash攻击 - 只有不同的HP伤害。你可以用长矛或10英尺的杆子推力。你可以扔一本法术书。 (而那些事情比你想象的还要多。)一般来说,你可以用任何对象定义任何动作的结果。
答案 1 :(得分:0)
我喜欢界面和构图的想法,都提供了非常好的文档解决方案。但我有第三个想法:只需将throw()添加到MeleeWeapon中。听我说,如果你使用界面,它将使随机生成武器变得更加困难。如果使用构图,则必须重新开始并在武器内部创建投掷和近战对象。有时最简单的答案是要走的路,特别是因为你现在可以通过父类引用你的近战或远程对象并毫无顾虑地调用它们的throw方法。
答案 2 :(得分:0)
接口就像最好的方法:
<强>概念强>
也许让你的width:100%
类更抽象一点:只需要基本方法(攻击,删除等)。甚至可能使它不抽象,以便开箱即用。
现在,对于特殊功能,可以创建一些允许投掷,射击,爆炸等内容的界面。这样,为武器添加新功能将更容易,更省时。
现在,当调用攻击函数时,它可以根据武器类实现的接口完成不同类型的攻击。
<强>设计强>
基类:
Weapon
你可以用接口做的是如果可以击中敌人,方法返回true,或者如果敌人被击中,则从方法内部调用攻击函数。
近战界面:
//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
}
}
远程界面:
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
}
现在,当玩家尝试使用武器进行攻击时,应用程序可以检查武器类是否实现了这些接口,然后调用适当的方法。
如果武器类扩展了多个接口,那么找出要采取的动作的好方法可能是选择可能的动作,如果玩家选择了远程,则尝试执行远程攻击。例如,如果玩家选择了近战但是它是远程武器,则应该调用默认或其他可用攻击。