- - PR -
どんな型でも受け付けて比較できる方法はありますか?
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-01 08:31
IDクラスを実装し、その中にintのGUIDと、objectタイプのクライエントIDを作ろうとしています。クライエントIDの型はクライエントが自由に決められるようにしたいということで、object にしています。
ID同士を比較する時、GUIDの比較はintなので問題ないのですが、クライエントIDの比較で困っています。クラスのリファレンスが与えられた時にはリファレンス比較をし、値型が渡された時には値の比較をして一致しているかどうかを決めたいのですが、いい方法が思いつきません。以下に、objectを単純に比較したコードを書いてみました。これではリファレンス比較では問題ないのですが、たとえばintが渡された時など、単純なobject の == では、値が同じでもfalseが返ってきてしまいます。 ジェネリックを使った方が良いのかとも思い始めていますが、違う型で作ったID同士を比較する時に問題が出そう(IDをリストに入れておいて、新しいのが来た時に一致するものがあるか探したりするので)で、まだ上手い方法が見つかっていません。
何か良い方法は無いでしょうか。それとも、要求自体がおかしいのでしょうか。 どうぞよろしくお願いします。 | ||||||||
|
投稿日時: 2006-08-01 08:47
「何でも」と言うのは不可能です。特定のクラスを比較させるためには、そのクラスをどのようなルールで比較するのかコーディングする必要があります。従って、未知のクラスを何でも比較する事は、そもそもどうやっても出来ません。
このような場合には、比較を行う仮想メンバ関数を持つ共通の基底クラスから派生させる事で実現します。この場合、共通の基底クラスから派生していないクラス(型)同士を比較する事は出来ません。 あるいはtypeof演算子を用いて型を確認した後、それぞれの型に合わせた比較処理を行う事になるでしょう。 | ||||||||
|
投稿日時: 2006-08-01 09:10
if(o1.Equals(o2)) 仕様がよくないので実装もテケトーでいんじゃね?(w | ||||||||
|
投稿日時: 2006-08-01 12:38
テケトーどころかベストじゃないですか?
ただ object が参照型のインスタンスを参照している場合、必ずしもリファレンス比較にはなりません。 ぶさいくろうさんの言う通り仕様がよくありません。 「同値」である事を見たいなら必ず「同値」で比較すべきです。 「同値」をみたり「リファレンス」を見たりは駄目でしょう。 #ID クラスの Equals メソッドもオーバーライドする事をオススメします。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2006-08-01 13:00
あのままじゃまずいっしょ。ってことね。 その後のフォローありがとさん。 | ||||||||
|
投稿日時: 2006-08-01 22:21
まだわからないようなら、、、、
clientID に、あるデータは float、あるデータは int、あるデータは string、あるデータは DateTime、あるデータは独自の型で入っていたら、どうやって比較するの? | ||||||||
|
投稿日時: 2006-08-02 02:25
皆さん、ご意見有り難うございます。
仕様がダメだということなのですが、こんな風に変えてみるとどうでしょう? 2つのclientIDの比較で - 2つの型が違う場合は false - 値型が渡された場合、値を比べて、一致するかどうかで true/false - 値型でない場合はリファレンス比較 クライエントコードを書く人が出来るだけ自由に使える方法を提供しようとしています。独自にIDを持っているならそれを使っても良いし、呼び出しを行うクラス自体をIDに使ってもいいし…という考え方です。 どうぞよろしくお願いします。 | ||||||||
|
投稿日時: 2006-08-02 04:03
何か違和感があると思ったら、参照型の場合は参照比較で"OK"なのか。値型が問題と。
ほんとにそうならEqualsでほぼ解決だと思いますがね。ダメでしたか? Equalsをオーバーライドされたクラスが渡されたらダメですが。 そもそも、System.Object クラス自体に機能を追加することはできません。
実際にIDクラスを比較するコードは、どんな感じで、一体どう自由なのでしょう。 そもそもこれをどんな局面で使うのだろう。
自由にしたいならIDクラス自体を継承してもらうとかにすればいいんじゃないですかね。 |
1|2|3
次のページへ»