OOP中的成员与子类
Members vs subclasses in OOP
我决定通过编写基于文本的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;
}
}
相关文章:
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 初始化依赖于子类的继承类的常量类成员
- C++:在子类中扩展静态 STL 容器/映射成员?
- 从子类访问模板类成员时出现"找不到标识符"错误
- 如何访问子类的新成员函数?
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- 如何从子类的构造函数初始化父类的私有成员
- 父类和子类中的 C++ 同名成员
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- C++ 类成员函数的函子模板
- 构造添加了成员变量的子类
- C++基类指针调用子虚函数,为什么基类指针可以看到子类成员
- 如何访问存储在父类中的子类成员
- B2Draw子类成员函数未调用
- 带模板的继承(访问子类成员函数内父类的变量和对象)
- 如何访问子类成员
- 使用指向无法dynamic_cast的基 abstact 类的指针访问子类成员
- 非静态/静态/全局/子类成员的初始化顺序
- 如何在c++中获取子类成员
- 使用auto循环vector时使用子类成员