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

1

のすべてのメンバーは でMessageWriteあるため、内部でprotected作成するだけでよいため、 から継承するクラスはアクセスできません。しかし、あなたのデザインにはまだ次のような問題があります。setReceiveTime() privateMessageUpdateMessageUpdate

あなたのデザインがダイヤモンドを避けているのはどうしてですか? それは同様に次のことにつながるのではないでしょうか:

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

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

後でIS-Aではないと言ったとき、なぜ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 に答える