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

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

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

Re[6]: Publicなメンバを持つクラスのコレクションを隠蔽したい


(過去ログ 101 を表示中)

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

■60496 / inTopicNo.1)  Publicなメンバを持つクラスのコレクションを隠蔽したい
  
□投稿者/ ash (4回)-(2011/07/06(Wed) 07:21:53)

分類:[.NET 全般] 

public class MyList<T>
{
private List<T> list;
public T this[int index]
{
get { return list[index]; }//getのみ公開
}
}

こんなかんじでインデクサでカプセル化できると思ったのですが
メンバhogeがpublicである場合

testList[0] = 〜〜  ←setが無いのでこれはできない
testList[0].hoge = 10; ←参照型は普通にアクセスできる

となります
コレクションになるクラスの中身を変えずに隠蔽することは可能でしょうか?

引用返信 編集キー/
■60497 / inTopicNo.2)  Re[1]: Publicなメンバを持つクラスのコレクションを隠蔽したい
□投稿者/ Azulean (778回)-(2011/07/06(Wed) 07:27:08)
No60496 (ash さん) に返信
> コレクションになるクラスの中身を変えずに隠蔽することは可能でしょうか?

値型の場合は普通にコピーが返ってくるので気にする必要はないですが、参照型の場合は無理じゃないでしょうか。
コピーを返すように作り込めば近い形を実現できるとは思いますが、ジェネリックとする場合はコピーを作るインターフェースを実装していることと言った制約がなければ無理だと思っています。
引用返信 編集キー/
■60498 / inTopicNo.3)  Re[1]: Publicなメンバを持つクラスのコレクションを隠蔽したい
□投稿者/ shu (827回)-(2011/07/06(Wed) 07:38:01)
No60496 (ash さん) に返信

こんな定義はだめですか?

	class MyClass
	{
		private int _hoge;
		public int hoge {
			get{
				return _hoge;
			}
		}

		public MyClass(int hogeArg)
		{
			_hoge = hogeArg;
		}
	}

引用返信 編集キー/
■60499 / inTopicNo.4)  Re[2]: Publicなメンバを持つクラスのコレクションを隠蔽したい
□投稿者/ ash (5回)-(2011/07/06(Wed) 08:08:07)
Azulean様
回答ありがとうございます。
無理ですか・・
非公開のものを公開なのは直感的に無理そうですが、逆はなんとかなりそうと期待していたので残念です。

shu様
コレクションになるクラスの中身を変えずに=MyClassの中身を変えずに との質問でした。


引用返信 編集キー/
■60500 / inTopicNo.5)  Re[3]: Publicなメンバを持つクラスのコレクションを隠蔽したい
□投稿者/ shu (828回)-(2011/07/06(Wed) 08:26:42)
No60499 (ash さん) に返信

> shu様
> コレクションになるクラスの中身を変えずに=MyClassの中身を変えずに との質問でした。

やはりそういうことですね。Tのオブジェクトが公開された時点でその公開メンバには
当然アクセス出来てしまいますね。MyClassListのようにジェネリックでなければMyClassの
オブジェクトを公開しなければhogeについてgetで公開すれば可能だとは思います。ジェネリック
のままならDynamic使うかReflectionを使えば可能ですね。あくまでTのオブジェクトを公開
しないことが前提ですが。
引用返信 編集キー/
■60501 / inTopicNo.6)  Re[4]: Publicなメンバを持つクラスのコレクションを隠蔽したい
□投稿者/ ash (6回)-(2011/07/06(Wed) 08:36:53)
今回のケースは無理だということは理解しましたが後学のために質問させてください。

>>MyClassListのようにジェネリックでなければMyClassの
>>オブジェクトを公開しなければhogeについてgetで公開すれば可能だとは思います。ジェネリック
>>のままならDynamic使うかReflectionを使えば可能ですね。あくまでTのオブジェクトを公開
>>しないことが前提ですが。


この部分が理解できませんでした。


コレクションを作成するクラス(今回の場合はMyClass)のメンバがgetのみ公開の場合に、
DynamicかReflectionでメンバをsetすることができるということでしょうか?
引用返信 編集キー/
■60502 / inTopicNo.7)  Re[5]: Publicなメンバを持つクラスのコレクションを隠蔽したい
□投稿者/ shu (829回)-(2011/07/06(Wed) 09:14:49)
2011/07/06(Wed) 09:22:25 編集(投稿者)
No60501 (ash さん) に返信

> この部分が理解できませんでした。
> 
> コレクションを作成するクラス(今回の場合はMyClass)のメンバがgetのみ公開の場合に、
> DynamicかReflectionでメンバをsetすることができるということでしょうか?

	class MyClass
	{
		public int hoge { get; set; }
	}

ジェネリック未使用
	class MyClassList
	{
		private List<MyClass> list;
		public int hoge(int index)
		{
			return list[index].hoge;
		}

		public MyClassList(List<MyClass> listArg)
		{
			list = listArg;
		}
	}

ジェネリック使用
	public class MyList<T>
	{
		private List<T> list;
		public T2 GetValue<T2>(int index, string Name)
		{
			T itm = list[index];
この辺がReflection(using System.Reflection;が必要です) 
			Type tp = typeof(T);
			PropertyInfo prp = tp.GetProperty(Name);
			return (T2)(prp.GetValue(itm, null));
		}

		public MyList(List<T> listArg)
		{
			list = listArg;
		}
	}


呼び出し:
List<MyClass> list = new List<MyClass> { new MyClass { hoge = 1 },
                     new MyClass { hoge = 2 },
                     new MyClass { hoge = 3 } };

MyList<MyClass> list2 = new MyList<MyClass>(list);
int a = list2.GetValue<int>(0,"hoge");

MyClassList list3 = new MyClassList(list);
int b = list3.hoge(1);

引用返信 編集キー/
■60503 / inTopicNo.8)  Re[6]: Publicなメンバを持つクラスのコレクションを隠蔽したい
□投稿者/ ash (7回)-(2011/07/06(Wed) 09:54:38)
Tのオブジェクトを公開しない の意味をTのメンバを公開しない と読み間違えておりました

インデクサで公開していた部分を無くしメンバへのアクセスを自身で用意してカプセル化を実現しようというわけですね。
この方法で問題なく乗り切れそうです。

お付き合い頂き心より感謝いたします。
ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -