我正在学习C ++中的类,抽象类和继承。我正在写一个扮演克莱德(Cluedo)的小私人侦探。
到目前为止,我正在考虑一个基类:
class player
{
protected:
std::string name,character,position;
std::string* hand;
public:
//things he can do
};
然后使用电脑播放器:
class computer:public player
{
private:
fakePlayer* spreadsheet;
public:
//things he can do
};
计算机基本上是一个播放器,它具有fakePlayer
数组,其中fakePlayer是:
class fakePlayer:public player
{
std::string* hasNot; //card I know he doesn't have
std::string* possibly; //cards he may have
std::string* shown; //cards I hve shown to him
};
fakePlayer
不需要character
或position
;这是否意味着它不是打字员?我可以做的另一件事是拥有一个抽象class player
,它只有一个name
和一个hand
,然后派生类class human:public player
,class fakePlayer:public player
和{ {1}}。
拥有不使用某些受保护成员的派生类是否更方便?还是创建一个更通用的抽象类更好?
答案 0 :(得分:1)
如果基类的某些数据成员与派生类不相关,则继承设计可能需要引起注意。 (严格来说,这没错。但是,可能还没有完全考虑到这一点。)您似乎已经认识到了,所以很多都很好。
如何解决这种情况通常需要进行一些判断。我首先要问基类(在这种情况下为player
)应体现什么?对我来说,player
指的是游戏中的一名玩家,这基本上就是您编写的代码。那么,这个“假冒玩家”如何适应画面呢?假冒的玩家需要扮演玩家的角色吗?假冒的玩家应该能够在自己之间玩游戏吗?如果没有,它可能不应继承自player
。
另一种可能性是拥有player
和fakePlayer
的通用基类(包括player
源自fakePlayer
的可能性)。现在要问的问题是这个普通基类体现了什么?玩家和假玩家有什么共同点?他们为什么要有一个共同的基类?
随着您对程序的深入了解,您可能会发现使用通用基类的原因。但是,从您显示的代码来看,假冒播放器看起来无非是保持记录。它不是玩家,而是关于玩家的注释。仅凭这一点并不能证明共享基类是合理的。它们可能共享一些辅助类(例如卡类,而不是使用字符串),但不共享基类。对于您的代码,我的下一步是从:public player
的定义中删除“ fakePlayer
”(并可能重命名该类),然后从那里开始。