-2

我决定通过编写一个基于文本的 RPG 游戏来尝试记住几年前我在面向对象编程课上学到的东西。我不确定我是否希望完成这项工作,我也不太在乎。我只是想重新学习如何编写程序。

在记住函数、数据类型和类如何在 C++ 中工作的基础知识后,我编写了以下代码。

class Character
{
      string Name;

public:
       Character()
       {
           Name = "Charname";
       }

       string GetName(){return Name;}
       void SetName(string sName){Name=sName;}
};

现在我希望我的角色有种族。第一个想法是创建 Character 类的子类,每个允许的种族都有一个。在我看来,这就像面向对象编程中要做的事情。但我开始思考它是如何工作的。我希望能够说出诸如“如果汤姆是人类,克拉拉是兽人,并且汤姆和克拉拉试图结婚,则给出错误信息”之类的话。我可能还希望人类和兽人有不同的方法来做不同的事情。

在我看来,从广义上讲,在前者中,我想将 Race 视为 Character 的成员(我将其理解为属性),而在前者中,就像它是子类一样。

如果 Human 是 Character 的子类,前者甚至可以做到吗?也就是说,一个对象能知道它属于哪个类吗?

我应该怎么做,为什么?

4

1 回答 1

2

这个设计问题被称为“专业化”。在这种情况下,您希望 Race 成为属性,而不是子类,因为所有种族的行为基本相同。在种族赋予特殊能力的情况下,以统一的方式在所有种族中处理。例如,假设只有一些种族可以在黑暗中看到,这就是你的做法:

int getVisionRange( int iCurrentLightLevel ){
    if( iCurrentLightLevel < LightLevel.DIM ){
       if( this.race == ORC || this.race == ELF ){
           return VisionRange.GOOD;
       } else {
           return VisionRange.NONE;
       }
    } else {
       return MAX_VISION_RANGE;
    }
}

或类似的规定。

于 2013-05-26T22:24:32.180 回答