OOP中的成员与子类

Members vs subclasses in OOP

本文关键字:子类 成员 OOP      更新时间:2023-10-16

我决定通过编写基于文本的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的子类,那么前者是否可能实现?也就是说,一个对象能知道它在哪个类中吗?

我该怎么做,为什么?

这个设计问题叫做"专门化"。在本例中,您希望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;
    }
}