1

我有一个 Message 类的对象,可以编写并随后更新。据我所知,MessageUpdate IS-A MessageWrite:

class MessageWrite
{
  protected:
    void setVersion(int version_) {...}
    void setReceiveTime(int tmReceive_) {...}

    Message _msg;
};


class MessageUpdate:public MessageWrite
{
    //ONLY setVersionShould be accessible here, NOT setReceiveTime
};

是否有方法访问级别和继承级别的组合可以帮助实现这一目标?

我知道 MessageUpdate 可以简单地作为基类,但有一个问题:如果我想扩展消息类,它会导致菱形图案。考虑:

class MessageUpdate {...};
class MessageWrite: public MessageUpdate {...};


//Now, while extending:
class AdminMessageUpdate:public MessageUpdate {...};
class AdminMessageWrite: public AdminMessageUpdate, public MessageWrite //DIAMOND Pattern!!

我对继承的理解差距在哪里?在没有多重继承的情况下,有没有完全不同的方法来实现这个逻辑(如后面的代码片段所示)?

4

4 回答 4

2

只需声明方法:

private:
void setReceiveTime(int tmReceive_);

private在基类中使用访问说明符MessageWrite

我的这个答案应该是一个很好的阅读:

什么是访问说明符?我应该以私有、受保护还是公共继承?

于 2012-04-09T14:08:38.383 回答
1

如果MessageUpdateis-a MessageWrite,那么根据定义,它可以访问所有受保护的和公共的成员。

因此,如果您不想在 中公开/受保护地公开某些成员MessageWriteMessageUpdate那么根据Liskov 替换原则MessageUpdate不能是MessageWrite.

于 2012-04-09T14:08:51.533 回答
1

MessageWrite由于are 的所有成员protected,您只需 make setReceiveTime() privateinside MessageUpdate,因此继承自的类MessageUpdate将无法访问它。但是我仍然对您的设计有一些问题,例如:

您的设计如何避免使用钻石?它不会同样导致:

class MessageWrite {...};
class MessageUpdate: public MessageWrite {...};

//Now, while extending:
class AdminMessageWrite:public MessageWrite {...};
class AdminMessageUpdate: public AdminMessageWrite, public MessageUpdate //DIAMOND Pattern!!

当您后来说它不是时,您为什么认为MessageUpdateIS-A (通过指定并非所有都适用于它)?如果此代码必须无效:MessageWriteMessageWrite

MessageWrite& m = MessageUpdate();
m.setReceiveTime(); // Should this be valid?

然后MessageUpdateIS-NOT-A MessageWrite。如果我的代码应该是有效的,那么没有理由避免访问setReceiveTime()in MessageUpdate

你可能会更好地创建一个基类AdminMessage,然后直接从它继承以避免菱形:

class MessageWrite {...};
class MessageUpdate: public MessageWrite {...};

//Now, while extending:
class AdminMessage {...};
class AdminMessageWrite: public MessageWrite, public AdminMessage {...};
class AdminMessageUpdate: public MessageUpdate, public AdminMessage {...}; // No diamond
于 2012-04-09T14:24:22.047 回答
0

protected:继承成员可以访问。

private:继承的成员不能访问。

  protected:
    void setVersion(int version_) {...}
  private:
    void setReceiveTime(int tmReceive_) {...}
于 2012-04-09T14:08:09.837 回答