Java - 抽象 class 和接口
Java - abstract class and interface
我正在做我的 java 项目,这是一个基本的角色扮演游戏,我有一个 OOD 问题(我想这很简单,但这是我的第一个 java 项目)。我开始研究武器,我用一个名为攻击的抽象方法创建了一个抽象武器 class。 Weapon有两个subclasses——MeleeWeapon和RangedWeapon,都有攻击方式,没问题。
然后我想到了另一件事——如果像矛这样的近战武器对象可以用于近战并且还可以投掷会怎样?在这种情况下,什么是好的解决方案?
我喜欢界面和组合的想法,它们都提供了有据可查的解决方案。但我有第三个想法:只需将 throw() 添加到 MeleeWeapon。听我说完,如果你使用界面,随机生成武器会变得更加困难。如果你使用组合,你必须重新开始并在你的武器中创建投掷和近战对象。有时最简单的答案是要走的路,特别是因为您现在可以通过它们的父级引用您的近战或远程对象并调用它们的 throw 方法而无需担心。
一种选择是使用组合而不是继承。
每种武器都可以提供一组攻击。例如,Weapon.getAttacks()
returns 一组支持的攻击。在子类中,Spear.getAttacks()
returns 个 Thrust
、Throw
和 BashBashBash
的实例。
这允许您使用多种武器进行相同的攻击。狼牙棒和长矛都可以提供 Bash 攻击——只是 HP 伤害不同。你可以用长矛或 10 英尺长的杆子刺。你可以扔一本法术书。 (而且这些事情比你想象的更伤人。)一般来说,你可以用任何对象定义任何动作的结果。
接口接缝喜欢的最佳方法:
概念
也许可以使您的 Weapon
class 更抽象一些:只需要基本方法(攻击、投放等)。甚至可以让它成为非抽象的,这样它就可以开箱即用。
现在为了特殊功能制作一些界面,允许进行投掷、射击、爆炸等操作。这样给武器添加新功能会更容易,也更省时。
现在调用攻击函数时,它可以根据武器 class 实现的接口进行完全不同类型的攻击。
设计
基础class:
//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
}
}
如果敌人可以被击中,你可以用接口做的是使方法 return 为真,或者如果敌人可以被击中,则从方法中调用攻击函数。
近战界面:
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
}
弓箭武器class:
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
}
}
现在当玩家尝试使用武器进行攻击时,应用程序可以检查武器 class 是否实现了这些接口,然后调用适当的方法。
如果一件武器 class 扩展了多个界面,一个确定采取哪个动作的好方法可能是选择可能的动作,如果玩家选择了射程,则尝试执行射程攻击。例如,如果玩家选择了近战但它是远程武器,则应调用默认或仅其他可用的攻击。
我正在做我的 java 项目,这是一个基本的角色扮演游戏,我有一个 OOD 问题(我想这很简单,但这是我的第一个 java 项目)。我开始研究武器,我用一个名为攻击的抽象方法创建了一个抽象武器 class。 Weapon有两个subclasses——MeleeWeapon和RangedWeapon,都有攻击方式,没问题。
然后我想到了另一件事——如果像矛这样的近战武器对象可以用于近战并且还可以投掷会怎样?在这种情况下,什么是好的解决方案?
我喜欢界面和组合的想法,它们都提供了有据可查的解决方案。但我有第三个想法:只需将 throw() 添加到 MeleeWeapon。听我说完,如果你使用界面,随机生成武器会变得更加困难。如果你使用组合,你必须重新开始并在你的武器中创建投掷和近战对象。有时最简单的答案是要走的路,特别是因为您现在可以通过它们的父级引用您的近战或远程对象并调用它们的 throw 方法而无需担心。
一种选择是使用组合而不是继承。
每种武器都可以提供一组攻击。例如,Weapon.getAttacks()
returns 一组支持的攻击。在子类中,Spear.getAttacks()
returns 个 Thrust
、Throw
和 BashBashBash
的实例。
这允许您使用多种武器进行相同的攻击。狼牙棒和长矛都可以提供 Bash 攻击——只是 HP 伤害不同。你可以用长矛或 10 英尺长的杆子刺。你可以扔一本法术书。 (而且这些事情比你想象的更伤人。)一般来说,你可以用任何对象定义任何动作的结果。
接口接缝喜欢的最佳方法:
概念
也许可以使您的 Weapon
class 更抽象一些:只需要基本方法(攻击、投放等)。甚至可以让它成为非抽象的,这样它就可以开箱即用。
现在为了特殊功能制作一些界面,允许进行投掷、射击、爆炸等操作。这样给武器添加新功能会更容易,也更省时。
现在调用攻击函数时,它可以根据武器 class 实现的接口进行完全不同类型的攻击。
设计
基础class:
//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
}
}
如果敌人可以被击中,你可以用接口做的是使方法 return 为真,或者如果敌人可以被击中,则从方法中调用攻击函数。
近战界面:
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
}
弓箭武器class:
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
}
}
现在当玩家尝试使用武器进行攻击时,应用程序可以检查武器 class 是否实现了这些接口,然后调用适当的方法。
如果一件武器 class 扩展了多个界面,一个确定采取哪个动作的好方法可能是选择可能的动作,如果玩家选择了射程,则尝试执行射程攻击。例如,如果玩家选择了近战但它是远程武器,则应调用默认或仅其他可用的攻击。