- PR -

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

投稿者投稿内容
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-09-28 10:43
先日はTypeOfの件でありがとうございました。
さて、インターフェースをいくつも作っていくと結構大変になってきました。
それで色々思い悩んでいると、
特定のプロパティを持っているかどうかで事足りる場合も少なくないように
思えてきました。

というわけでVB.Netでオブジェクトのインスタンスが特定のプロパティを持っているか調べる方法をどなたかご存知でしょうか?

if Myobject.hasPropertyWrite("BackColor") then

みたいな書き方ができないものだろうかと考えています。

よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-28 10:53
こんにちは、じゃんぬ です。

引用:

ジブさんの書き込み (2005-09-28 10:43) より:

特定のプロパティを持っているかどうかで事足りる場合も少なくないように
思えてきました。


いえ、できればインターフェイスの方が安全でわかりやすいです。

引用:

というわけでVB.Netでオブジェクトのインスタンスが特定のプロパティを持っているか調べる方法をどなたかご存知でしょうか?


リフレクションなんかを調べると幸せになれるかもしれません。


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-09-28 11:22
じゃんぬねっとさん、ありがとうございました。

リフレクションもざっとですが調べてみました。

感想ですが、確かにインタフェースの方が安全でわかりやすい。です。

お恥ずかしいことですが、インタフェースも継承できることに
先ほど気がついたばかりです。

今のところ、それほど必要性を感じていなかったりしますが
必要性を感じないあたりが根本的な問題だったりするかもしれません。

インタフェースが増えて大変だというのは、そもそもの構造に欠陥があるのかもしれないと考えてみたり、
でも、いや、それはそれでそういうものなのかもしれないなどと考えたりもします。

ちょっと脱線してしまいました。

ありがとうございました。とても参考になりました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-28 11:29
こんにちは、じゃんぬ です。

引用:

ジブさんの書き込み (2005-09-28 11:22) より:

今のところ、それほど必要性を感じていなかったりしますが
必要性を感じないあたりが根本的な問題だったりするかもしれません。
インタフェースが増えて大変だというのは、そもそもの構造に欠陥があるのかもしれないと考えてみたり、
でも、いや、それはそれでそういうものなのかもしれないなどと考えたりもします。


どこかでも言いましたが、「実行時に型を見たりしなければならない」
こういう条件の分岐は極力避けるべきです。
あまりに多い場合は設計に問題があるとさえ見ています。

引用:

ちょっと脱線してしまいました。
ありがとうございました。とても参考になりました。


ついでなので、わかりやすいページのリンクを貼っておきます。
後から同じ悩みを持った人が、情報を共有できるように...
http://dobon.net/vb/dotnet/programing/typegetmember.html


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-28 11:45
こんにちは。

完全に興味でお訊きしたいので、お答えしたくないのであれば、無視して頂いて結構です。ちょっと参考にしたい、という気持ちからです。

どうやら、実行時に型を判断したいというのが頻発しているようですが、どういう必要性からなのでしょうか?
私自身ももちろん実行時に型を判断したい、と思った事はありますが、そんなに頻発したことがないので、どういう要件なのかなぁと思いまして。

引用:

さて、インターフェースをいくつも作っていくと結構大変になってきました。


引用:

お恥ずかしいことですが、インタフェースも継承できることに
先ほど気がついたばかりです。



という事みたいですが、それではどのようにインターフェースを使っていたのでしょうか?

冒頭にも述べましたが、不快であれば無視して頂いて結構です。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-09-28 13:04
じゃんぬさん、囚人?さん、ありがとうございます。

実はちょっとしたお絵かきソフトというかVisioみたいなものを作っていまして
いろいろなツールを描画しているオブジェクトにドロップできるかの判断をしているのです。

描画オブジェクトはかなり継承構造に気をつけて作ったつもりなのですが
どうしてもインタフェースを使う局面が増えるようになっています。

結構マトリクスで考えなくちゃならなくて混乱しそうです。

後付のインタフェースなのでちょっと作業が大変なのは、確かに基本構造に問題があるからに過ぎません。

それでも、インタフェースの数を気にせず増やすというのもためらわれ
あーでもないこーでもないと試行錯誤しています。

こんな関数を作ってみました。


Public Shared Function InterfaceCheck(ByVal obj As Object, ByVal Types() As Type) As Boolean

Dim t_Type As System.Type

If obj Is Nothing Then
Return False       'これはTrueがいいのかなぁ?
End If

For Each t_Type In Types
If obj.GetType.Equals(t_Type) Then
Return True
End If
Next
Return False

End Function

少し改善するかも?

VB6のころに比べたらはるかに進歩しているのですが
まだまたわからないことだらけです。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-09-28 13:09
ジブです。
ごめんなさい。ソースが左によってしまいました。

  以後気をつけます。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-28 13:17
なるほど。ありがとうございました。
そんな感じと聞いたら、デザインパターンを適用できまくり!とちょっとテンション上がっちゃいますね^^;

null をチェックしているなら、Null Object。
描画オブジェクトが木構造になっているなら、Composite とか。(必ずしも適用するのが最適解ではありませんが)

継承という強力な武器を持っているのに、型チェックするというのはやはり勿体無い気がしますね。



[ メッセージ編集済み 編集者: 囚人 編集日時 2005-09-28 13:20 ]

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