C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 相互参照可能なクラスの実装方法について


(過去ログ 55 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■30727 / inTopicNo.1)  相互参照可能なクラスの実装方法について
  
□投稿者/ ふわり (1回)-(2009/01/05(Mon) 13:51:45)

分類:[C#] 

はじめまして、ふわりと申します。

タイトルの通り、相互参照可能なクラスを実装したいと考えております。
相互参照という言葉が適当かどうかは分かりかねるのですが、
イメージとしては、DataSetとDataTableの間にある、以下のような関係のことを指します。

DataSet ds = new DataSet("DS1");
DataTable dt = new DataTable("DT1");
Console.WriteLine(dt.DataSet == null ? "nullです" : dt.DataSet.DataSetName); // Add前は、null
ds.Tables.Add(dt);
Console.WriteLine(dt.DataSet == null ? "nullです" : dt.DataSet.DataSetName); // Add後は、DataSetへの参照を持っている

上記を踏まえて、Bushoクラス⇔Memberクラスを作成し、
メンバーのインスタンスから、そのメンバーが所属する部署を参照可能にしたいと考えております。

以下、とりあえず出来ているかな?程度のコードになるのですが、
果たしてこのような実装が定石かどうかわからず、悩んでおります。
(もっとスマートなデザインパターン(?)として確立されているのかどうか…とか。)
アドバイスの程、よろしくお願いいたします。

	class Busho
	{
		private string _Name = null;
		private MemberCollection _Collection = null;
		public string Name
		{
			get
			{
				return _Name;
			}
			set
			{
				_Name = value;
			}
		}
		public MemberCollection Members
		{
			get
			{
				return _Collection;
			}
		}
		public Busho(string name)
		{
			_Name = name;
			_Collection = new MemberCollection();
			_Collection.Busho = this;		// メンバーコレクションから、部署を参照可能にする。
		}
	}
	class MemberCollection// : ICollection<Member> 後で実装予定
	{
		private List<Member> _Collection = new List<Member>();
		private Busho _Parent = null;
		internal Busho Busho
		{
			get
			{
				return _Parent;
			}
			set
			{
				_Parent = value;
			}
		}
		public void Add(Member member)
		{
			// 追加可否チェック。不可の場合は例外。
			// if...
			member.Parent = this;		// メンバーから、コレクションを参照可能にする。
			_Collection.Add(member);
		}
		public bool Remove(Member member)
		{
			member.Parent = null;
			return _Collection.Remove(member);
		}
	}
	class Member
	{
		private string _Name = null;
		private MemberCollection _Parent = null;
		internal MemberCollection Parent
		{
			get
			{
				return _Parent;
			}
			set
			{
				_Parent = value;
			}
		}
		public Busho Busho
		{
			get
			{
				if (_Parent == null)
				{
					return null;
				}
				return _Parent.Busho;
			}
		}
		public string Name
		{
			get
			{
				return _Name;
			}
			set
			{
				_Name = value;
			}
		}
		public Member()
		{
		}
		public Member(string name)
			: this()
		{
			_Name = name;
		}
	}

引用返信 編集キー/
■30730 / inTopicNo.2)  Re[1]: 相互参照可能なクラスの実装方法について
□投稿者/ επιστημη (1484回)-(2009/01/05(Mon) 14:28:26)
επιστημη さんの Web サイト
> 果たしてこのような実装が定石かどうかわからず、悩んでおります。

アッチからコッチ/コッチからアッチの参照を互いに持つわけね。
定石かどーかは知らんけど、よくある実装じゃないでしょか。
素直な実装で、悩むこたないように思えます。

引用返信 編集キー/
■30734 / inTopicNo.3)  Re[1]: 相互参照可能なクラスの実装方法について
□投稿者/ よねKEN (247回)-(2009/01/05(Mon) 14:48:26)
> 以下、とりあえず出来ているかな?程度のコードになるのですが、
> 果たしてこのような実装が定石かどうかわからず、悩んでおります。

以前、親子関係の構造の作成方法で似たような質問がありました。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=29246&KLOG=53

上記URLで書いた私のコード例(VBです)でもだいたい同じような実装をしています。
親は子のコレクションを持ち、子のコレクションが親を持つ構造なところは同じです。
子は子のコレクションに追加/挿入されたときに内部的に親がセットされるようにしている点は違いますが、
たいした差ではないですね。

引用返信 編集キー/
■30747 / inTopicNo.4)  Re[2]: 相互参照可能なクラスの実装方法について
□投稿者/ ふわり (2回)-(2009/01/05(Mon) 16:27:32)
επιστημηさん、よねKENさん

私の意図している事が伝わっており、安心しております。
また、自分の実装にも特に問題が無いようなので、自信を持って実装を進められそうです。

アドバイス頂き、ありがとうございました。
解決済みとさせていただきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -