3

我正在尝试为游戏创建角色类。

关于角色类: - 它有不同的角色,例如战士,射手,国王。- 每个都有不同的属性,例如攻击,防御。

我的问题是我应该使用继承还是组合?我有一个角色类,那么我应该创建战士类并扩展角色类,还是应该在角色类中放置一个类似 String ID ="Warrior" 的标识符?

4

6 回答 6

6

如果有组合属性的选项(例如,如果你有一个 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()
    }

 }

通过这种方式,您可以通过一次实现所有内容,拥有模块化的类设计来享受所有世界,并且您可以享受您可能需要的任何角色组合。祝你好运!

于 2013-04-10T16:23:18.513 回答
1

我喜欢这样做的方式是写出您想要拥有的每个类的所有属性和参数。查看类之间共享哪些参数并决定如何处理它。

由于您已经有一个 Character 类,请决定您希望 Character 的实际子类有多大不同。

您还可以为不同的类使用不同的接口。接口将具有特定类的唯一方法。

不要犹豫,去做吧,你如何处理它并不重要,但是接口和继承肯定会让你的代码更容易理解。祝你好运!

于 2013-04-10T16:30:21.393 回答
0

我认为就模块化设计和(后来的)复杂性而言,最好的解决方案是扩展基类,因为您可以仅将接口用于“战士”或“射手”等。

并考虑添加您只想为特定字符设置的不同方法或属性(现在或以后)。

希望这可以帮助。

最好的,

于 2013-04-10T16:15:17.637 回答
0

如果所有字符共享某些属性,那么我将拥有一个具有所述属性的 Character 类,并且每种特定类型的字符都将扩展 Character 并添加它们的特定属性。

于 2013-04-10T16:16:21.393 回答
0

String id = "Warrior" 听起来像“字符串类型编程”,你应该避免它。

经验法则是类层次结构不应该很深(不超过 3 或 4 个级别)。

我会定义一个基类(Character)和一些派生类(Warrior、Wizard 等),但不会更深入:

  • 角色 < 战士 < 斧头战士
  • 字符<向导<LightWizard
  • 角色<巫师<邪恶巫师

看起来您的角色确实具有不同的属性,但具有基本相同的行为(攻击、防御等)。但是攻击和防御的手段是不同的(战士会散打和砍杀,巫师会施法)。这是继承和多态性的一个很好的候选。

于 2013-04-10T16:18:16.363 回答
0

如果角色对相同属性具有不同的值,那么您不应该创建不同的类,但如果战士作为一个整体可以做事/具有其他人不能做的不同属性,那么可以。例如:如果战士的“力量”属性值与魔术师不同,那么在这种情况下,不需要为每个人创建子类,因为它们在概念上是相同的。但是,如果魔术师可以飞,那么是的,你应该。

于 2013-04-10T16:21:24.203 回答