我正在尝试为游戏创建角色类。
关于角色类: - 它有不同的角色,例如战士,射手,国王。- 每个都有不同的属性,例如攻击,防御。
我的问题是我应该使用继承还是组合?我有一个角色类,那么我应该创建战士类并扩展角色类,还是应该在角色类中放置一个类似 String ID ="Warrior" 的标识符?
我正在尝试为游戏创建角色类。
关于角色类: - 它有不同的角色,例如战士,射手,国王。- 每个都有不同的属性,例如攻击,防御。
我的问题是我应该使用继承还是组合?我有一个角色类,那么我应该创建战士类并扩展角色类,还是应该在角色类中放置一个类似 String ID ="Warrior" 的标识符?
如果有组合属性的选项(例如,如果你有一个 WarriorKing 类),我会做的是对类 + 接口使用继承。
如果您想在 WarriorKing 之类的情况下享受这两种类型的属性,您可以执行以下操作:
class Character { ... }
interface Warrior {...}
interface King {...}
abstract class KingImpl extends Character implements King
abstract class WarriorImpl extends Character implements Warrior
然后你结合一切:
class WarriorKing extends Character implements Warrior, King {
private King kingImpl;
private Warrior warriorImpl;
public WarriorKing() {
kingImpl = new KingImpl();
warriorImpl = new WarriorImpl();
}
现在假设您kill()
在 Warrior 接口中有一个方法需要由每个实现类实现(WarriorKing 必须实现它),并且已经在抽象 WarriorImpl 类中实现,您可以执行以下操作:
class WarriorKing extends Character implements Warrior, King {
private King kingImpl;
private Warrior warriorImpl;
public WarriorKing() {
kingImpl = new KingImpl();
warriorImpl = new WarriorImpl();
}
public void kill() {
this.warriorImpl.kill()
}
}
通过这种方式,您可以通过一次实现所有内容,拥有模块化的类设计来享受所有世界,并且您可以享受您可能需要的任何角色组合。祝你好运!
我喜欢这样做的方式是写出您想要拥有的每个类的所有属性和参数。查看类之间共享哪些参数并决定如何处理它。
由于您已经有一个 Character 类,请决定您希望 Character 的实际子类有多大不同。
您还可以为不同的类使用不同的接口。接口将具有特定类的唯一方法。
不要犹豫,去做吧,你如何处理它并不重要,但是接口和继承肯定会让你的代码更容易理解。祝你好运!
我认为就模块化设计和(后来的)复杂性而言,最好的解决方案是扩展基类,因为您可以仅将接口用于“战士”或“射手”等。
并考虑添加您只想为特定字符设置的不同方法或属性(现在或以后)。
希望这可以帮助。
最好的,
如果所有字符共享某些属性,那么我将拥有一个具有所述属性的 Character 类,并且每种特定类型的字符都将扩展 Character 并添加它们的特定属性。
String id = "Warrior" 听起来像“字符串类型编程”,你应该避免它。
经验法则是类层次结构不应该很深(不超过 3 或 4 个级别)。
我会定义一个基类(Character)和一些派生类(Warrior、Wizard 等),但不会更深入:
看起来您的角色确实具有不同的属性,但具有基本相同的行为(攻击、防御等)。但是攻击和防御的手段是不同的(战士会散打和砍杀,巫师会施法)。这是继承和多态性的一个很好的候选。
如果角色对相同属性具有不同的值,那么您不应该创建不同的类,但如果战士作为一个整体可以做事/具有其他人不能做的不同属性,那么可以。例如:如果战士的“力量”属性值与魔术师不同,那么在这种情况下,不需要为每个人创建子类,因为它们在概念上是相同的。但是,如果魔术师可以飞,那么是的,你应该。