游戏角色类设计,继承还是构图?

时间:2013-04-10 16:12:17

标签: java

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

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

我的问题是我应该使用继承还是合成? 我有一个Character Class,那么我应该创建warrior类并扩展字符类,还是应该在Character类中添加一个像String ID =“Warrior”这样的标识符?

6 个答案:

答案 0 :(得分: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();

    }

现在假设你在Warrior界面中有一个方法kill()需要由每个实现类实现(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()
    }

 }

这样,您可以通过一次实施一切来享受所有的世界,拥有模块化的课程设计,您可以享受您可能需要的任何角色组合。祝你好运!

答案 1 :(得分:1)

我喜欢这样做的方法是写出你想拥有的每个类的所有属性和参数。查看类之间共享的参数,并确定您希望如何处理它。

由于您已经有了一个Character类,因此请确定您希望Character的实际子类有多么不同。

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

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

答案 2 :(得分:0)

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

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

希望这有帮助。

最佳,

答案 3 :(得分:0)

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

答案 4 :(得分:0)

String id =“Warrior”听起来像“串式编程”,你应该避免它。

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

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

  • 字符<战士< AxeWarrior
  • 字符<向导< LightWizard
  • 字符<向导< EvilWizard

看起来你的角色确实有不同的属性,但基本上具有相同的行为(攻击,防御等)。但攻击和防御的手段是不同的(一个战士会哈希和削减,一个巫师会拼出一个魔法)。这是继承和多态的良好候选者。

答案 5 :(得分:0)

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