多対多の関連を実装する方法

UMLでクラス間の関係が多対多である場合の実装例をC#とVBで紹介する。多対多の場合が一番実装が面倒である。お互いのオブジェクトが存在を知っている必要があるため、追加や削除の処理にひと工夫必要である。

下図のクラス図は、グループが複数の生徒をグループ化していて、生徒は自分がどのグループに属しているかを知っていることを表現しているモデルである。


実装例はダウンロードページからGROUP.ZIPファイルをダウンロードしていただきたい。グループクラスと生徒クラスは、お互いにコレクションクラスで参照しあう。ポイントは、インスタンスを追加・削除したとき、相手のインスタンスに対して自分自身の追加と削除を依頼する処理があるところである。単純に処理を依頼すると、相手も処理を依頼してくるので無限ループに陥ってしまう。そこで、それを回避するためのチェックがIf文で実装してある。


さらに、このモデルではグループが親グループとサブグループを持てるようになっていて、これも多対多で実装している。サンプルコードのテストケースでは、スクール、クラス1、クラス2の3つのグループをインスタンス化し、スクールのサブグループにクラス1、クラス2をセットしている。そして、クラス1、クラス2にそれぞれ4人、3人の生徒インスタンスを追加している。

テストケースでは、グループに属する生徒の人数をカウントするGetStudentCountをテストしている。グループがサブグループを持つ場合は、再帰的にサブグループの人数もカウントして集計していることが確認できる。

(注)サンプルのコレクションクラスは.NET Framework2.0以上で利用できるものです。またテストを実行するには、NUnitFrameworkへの参照設定が必要です。

トラックバック

トラックバックURL:
http://www.apricot-jp.com/cgi/mt/mt-tb.cgi/290

関連情報

Copyright(C) 2007 アーキテクト360 Allrights reserved.