如果孩子不需要父类的所有受保护成员,这是不好的类设计吗?

时间:2019-03-16 00:00:25

标签: c++ c++11 inheritance

我正在学习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不需要characterposition;这是否意味着它不是打字员?我可以做的另一件事是拥有一个抽象class player,它只有一个name和一个hand,然后派生类class human:public playerclass fakePlayer:public player和{ {1}}。

拥有不使用某些受保护成员的派生类是否更方便?还是创建一个更通用的抽象类更好?

1 个答案:

答案 0 :(得分:1)

如果基类的某些数据成员与派生类不相关,则继承设计可能需要引起注意。 (严格来说,这没错。但是,可能还没有完全考虑到这一点。)您似乎已经认识到了,所以很多都很好。

如何解决这种情况通常需要进行一些判断。我首先要问基类(在这种情况下为player)应体现什么?对我来说,player指的是游戏中的一名玩家,这基本上就是您编写的代码。那么,这个“假冒玩家”如何适应画面呢?假冒的玩家需要扮演玩家的角色吗?假冒的玩家应该能够在自己之间玩游戏吗?如果没有,它可能不应继承自player

另一种可能性是拥有playerfakePlayer的通用基类(包括player源自fakePlayer的可能性)。现在要问的问题是这个普通基类体现了什么?玩家和假玩家有什么共同点?他们为什么要有一个共同的基类?

随着您对程序的深入了解,您可能会发现使用通用基类的原因。但是,从您显示的代码来看,假冒播放器看起来无非是保持记录。它不是玩家,而是关于玩家的注释。仅凭这一点并不能证明共享基类是合理的。它们可能共享一些辅助类(例如卡类,而不是使用字符串),但不共享基类。对于您的代码,我的下一步是从:public player的定义中删除“ fakePlayer”(并可能重命名该类),然后从那里开始。