- 締切済み
クラス間の関係
単行本、CD、DVDの三つを著作物と見たときのモデル化する時、これらの共通点は作者、出版社、出版時間、単価、内容などであるから、これらをクラスの属性にします。でも、各クラスは内容の取得方式が違います。本は目で、CDは耳で、DVDは目と耳両方で取得ができます。この観点から三つクラスの関係を示していいですか、ちょっと分からないです、そして、クラス図に書くとどういうになるでしょうか? 宜しく、お願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Fooky
- ベストアンサー率71% (59/82)
「三つクラスの関係を示す」「クラス図」というのが よく分かりませんが、こういうことをしたい ということなんでしょうか? Media / \ VisualMedia AudioMedia \ / AVMedia (下のクラスが上のクラスを継承している) class Media { string author; string publisher; ... }; class VisualMedia : virtual public Media { string sentences; public: void readContent(); }; class AudioMedia : virtual public Media { const int audioDataBytes = 1000000; char audioData[audioDataBytes]; public: void playAudio(); }; class AVMedia : public VisualMedia, public AudioMedia { }; クラス"Media"は、作者、出版者などの情報を 格納しておくクラスです。 クラス"VisualMedia"は、クラス"Media"を継承して、 文字情報とそれを読み出すメンバを付け加えたもの。 クラス"AudioMedia"は、クラス"Media"を継承して、 音情報とそれを再生するメンバを付け加えたもの。 クラス"AVMedia"はクラス"VisualMedia"と"AudioMedia"を 継承したもの。 このとき注意すべきは、"VisualMedia"と"AudioMedia"で、 "Media"を仮想継承しておかないといけないということです。 同一の基底クラスを持つ2つ以上のクラスから多重継承する 際には仮想継承をしないと、派生クラス内に基底クラスが 2つ以上存在することになります。(その結果、基底クラス へのアクセスに曖昧性が生じ、コンパイルエラーになると 思います) 重複して継承される可能性のある基底クラスを 仮想継承しておくことで、そのような場合にも 基底クラスが1つしか存在しなくなります。