- - PR -
C#2.0 ジェネリクスの型について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-07-04 14:48
ジャネリクスを用いて数値計算を行わせたいのです。
型に対してどうすれば必要な継承を教えることができるのか教えてください。 例えば下記の型Tに対して、intヤfloat等に対するキャストおよび +=演算についての方法をint型ヤfloat型から各々継承することはできますか? (説明のための例題であり実用上はあまり適切ではありませんがご容赦願います) public class test { // ジェネリクスを使いたいが // どうすればTに対して0のキャスト方法と+=ノ方法を教えることができますか // Tはfloat or intにのみ置き換えることを想定しています。 // そして、float or int実装されている機能が継承できればOKです public float sum(float[] inp) { return sum0<float>(inp); } public int sum(int[] inp) { return sum0<int>(inp); } /// <summary> /// 積算 /// </summary> /// <typeparam name="T float or intに置き換えることを想定"></typeparam> /// <param name="inp 入力"></param> /// <returns 結果></returns> private T sum0<T>(T[] inp) { // キャストに失敗する T ans = (T)0; for (int i = 0; i < inp.Length; i++) { // += 演算に失敗する ans += inp[i]; } return ans; } | ||||||||||||
|
投稿日時: 2006-07-04 20:03
諸農です。
where 制約にintやfloatを指定するのはダメですか。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2006-07-04 23:11
確かシールなクラスは指定できない筈です。(構造体はシール) MSDN フォーラムでもほぼ同様の質問があったのですが、そのときは、「加算するデリゲート」を渡すしかないと答えましたが、そもそもジェネリックを使うシナリオではないでしょうね。 素直にオーバーロードするか、float か double バージョンだけ用意しておくのでもよいでしょう。int を渡せますし。 _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2006-07-05 09:05
ご回答ありがとうございます。
これまで、数値計算のロジックを記述する場合、 int,long,float,doubleについて用意し、オーバーロードしていました。 ジェネリクスを使うことでパフォーマンスを落とさずコードの一元化が 図れるかも知れないと期待したので少し残念です。 | ||||||||||||
|
投稿日時: 2006-07-05 11:39
諸農です。
その通りでした。 すみません。
めんどくさいですけど、インタフェースとしてはintなどのオーバーロードバージョンを用意しておいて、内部ではdoubleバージョンでロジックの一元化って言うのも良いかも知れませんね。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ |
1