- PR -

オブジェクトが特定のプロパティを持っているか調べる方法

投稿者投稿内容
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-01 19:14
囚人さん。ありがとうございます。

引用:
引用:
はい。もちろんクライアントには関係ない話です。friendな世界の話です。


これはどういう意味でしょう?


うーん、つまりPublicでないという意味だったんですが。。。
クライアントには公開していないという意味で。

引用:

コード:

foreach( IPaintable item in myPaintableCollection )
{
if( item.EnablePaintBackGround )
{
// バックグラウンドを塗れる!
}
}


各派生クラスは、EnablePaintBackGround をオーバーライドして、「バックグラウンドを塗れる」かどうかを返せばよいです。



はい。でも、そうすると IPaintableにEnablePaintBackGroundを追加せねばならなくなります。

IPaintableが管理する問題ではないと思います。

また、基底のインタフェースやクラスは出来るだけ軽くしたいです。

[ メッセージ編集済み 編集者: ジブ 編集日時 2005-10-01 19:15 ]

[ メッセージ編集済み 編集者: ジブ 編集日時 2005-10-01 19:18 ]

[ メッセージ編集済み 編集者: ジブ 編集日時 2005-10-01 19:24 ]

[ メッセージ編集済み 編集者: ジブ 編集日時 2005-10-01 19:24 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-01 19:39
引用:

うーん、つまりPublicでないという意味だったんですが。。。
クライアントには公開していないという意味で。



済みません。
ここで言うクライアントとは、そのクラスを使用する者、つまり、IPaintable を扱うクラス等を指してました。同じアセンブリに属するとか、別のアセンブリに属するとか関係なく、IPaintable を扱うクラス全てです。(自身は含まない)

引用:

はい。でも、そうすると IPaintableにEnablePaintBackGroundを追加せねばならなくなります。

IPaintableが管理する問題ではないと思います。


そうでしょうか?
「バックグラウンドを塗るツール」は「描画クラス」に対して処理を行いたいわけですよね。
「バックグラウンドを塗るツール」は myPaintableCollection(IPaintable のコレクション)しか知りません。
そうなると、「バックグラウンドを塗るツール」が IPaintable に対して何か操作を行うためのインターフェース(ここでのインターフェースは概念の事)が必要となります。
それが、EnablePaintBackGround だと思うのですが。どうでしょう。

しかしながら、
コード:
	Friend Function HitTestIPaintBackroundAble( うんちゃらかんちゃら) as (例えば)Boolean
		For Each item as IPaintable In myPaintableCollection
			If TypeOf item Is IPaintBackroundAble then
				CType(item,IPaintBackroundAble).HitTestSignal = True
			End If
		Next
	End Function


という処理に対して、持ち出した案ですので、本当は私も IPaintable に EnablePaintBackGround をあまり持たせたくありません。

「バックグラウンドを塗るツール」の存在をもう少し吟味した方が良さそうですね。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-01 20:29
引用:

そうでしょうか?
「バックグラウンドを塗るツール」は「描画クラス」に対して処理を行いたいわけですよね。



「バックグラウンドを塗るツール」は「バックグラウンドを塗れる」オブジェクトを探しているだけです。
引用:

「バックグラウンドを塗るツール」は myPaintableCollection(IPaintable のコレクション)しか知りません。



まさにそのとおりです。
そしてmyPaintableCollectionはIpaintableには「バックグラウンドを塗れる」ですか?とは聞けません。
myPaintableCollectionはIPaintBackroundAbleな要素を探さなければなりません。
コード:

foreach( IPaintable item in myPaintableCollection )
{
if( item.EnablePaintBackGround )
{
// バックグラウンドを塗れる!
}
}


とは出来ないので
コード:

foreach( IPaintable item in myPaintableCollection )
{
if( item is IPaintBackroundAble)
{
// バックグラウンドを塗れる!
}
}



みたいなことをしないといけないんではないでしょうか。



[ メッセージ編集済み 編集者: ジブ 編集日時 2005-10-01 20:37 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-01 20:57
いいえ違います。(設計において「違います」なんて断言なんか出来ませんが^^;

それならば、「バックグラウンドを塗るツール」は最初から IPaintBackroundAble のコレクションしか参照しなければよいのです。

「バックグラウンドを塗るツール」が IPaintable のコレクションを参照するならば、「バックグラウンドを塗るツール」は IPaintable のインターフェースを通してのみ操作できるようにすべきです。つまり EnablePaintBackground。

IPaintable に 背景関係のインターフェイスを持たせられないならば、「バックグラウンドを塗るツール」は IPaintable を参照しないで、IPaintBackroundAble しか扱ってはいけません。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-01 21:13
引用:

それならば、「バックグラウンドを塗るツール」は最初から IPaintBackroundAble のコレクションしか参照しなければよいのです。


いえ、囚人さん自身がおっしゃったように

引用:

「バックグラウンドを塗るツール」は myPaintableCollection(IPaintable のコレクション)しか知りません。


なのです。


そして、ついでですが、myPaintableCollectionはコンテナクラスです。

多くのツールから依頼を受け、少なくともIpaintableな要素に対してはそのサービスを受け入れるか判断しなくてはいけません。

。。。。。。。。

そうか。少しひらめきました。

Ipaintableになにか汎用的な要素を追加できればよいんですね。

ありがとうございます。ちょっと考えてみます。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-01 21:42
引用:

引用:

それならば、「バックグラウンドを塗るツール」は最初から IPaintBackroundAble のコレクションしか参照しなければよいのです。


いえ、囚人さん自身がおっしゃったように
引用:

「バックグラウンドを塗るツール」は myPaintableCollection(IPaintable のコレクション)しか知りません。


なのです。


なので、
引用:

「バックグラウンドを塗るツール」が IPaintable のコレクションを参照するならば、「バックグラウンドを塗るツール」は IPaintable のインターフェースを通してのみ操作できるようにすべきです。つまり EnablePaintBackground。


と言っているのです。

しかし、やはり EnablePaintBackground を IPaintable に持たせるのが釈然としないというのも確かです。

いい案が出たようなので、待ってみます。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-01 21:55
引用:

しかし、やはり EnablePaintBackground を IPaintable に持たせるのが釈然としないというのも確かです。



釈然としないというより、それを始めたら
EnableForColerもEnablemarumaruも。。。。
無限に追加しなくてはならなくなりませんか?


囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-01 22:22
引用:

釈然としないというより、それを始めたら
EnableForColerもEnablemarumaruも。。。。
無限に追加しなくてはならなくなりませんか?



先に言ったとおり、「描画クラス」は Draw() という「描画を行う振る舞い」だけ持つのが良いと私は思っています。

「バックグラウンドを塗るツール」というのと「描画クラス」の関係がイマイチはっきりしないので何ともいえませんが、「バックグラウンドを塗る」というのも「描画クラス」やらせたいです。
つまり、Draw() 処理中に、自分が「バックグラウンドを塗るクラス」であるならば、バックグラウンドを塗ればいいのです。

しかしながら、今「バックグラウンドを塗るツール」というものの存在を前提としているので、IPaintable に EnablePaintBackground が必要である、というわけです。

「色を塗るツール」というものが存在するならば、EnableForColer も必要になるでしょう。
しかし、私の考えは、「描画クラス」の派生クラスが、自分が「色を塗るべきクラス」であるならば Draw() 中に色を塗ればよいのです。

スキルアップ/キャリアアップ(JOB@IT)