• ベストアンサー

デリゲートとジェネリクスとかの使いどころについて

インターフェイスとデリゲートとジェネリクスとコレクションの使いどころについて質問です。 これら4つの使いどころが、いつ使うのかわかりません。 どういったときに使うのか教えてくださいmm

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> フォームにあるオブジェクトはすべてコレクションに入ると書いていました。 FormのControlsプロパティがそれですね。 > なら、オブジェクトの値はすべてコレクションから取り出すべきだと思いますが間違っていますか? コントロールから値を取り出すのはコントロールによって異なります。コレクションにはボタンやラベルなども含まれるので、これらを除外しながらひとつずつコントロールに適した取り出し方をしなければなりません。 コントロールの数にもよりますが、普通は直接取り出したほうが楽です。 (これもまた状況によってですが) > すべてプロパティ経由で値を格納して、取り出すのはコレクションから取り出したらいいと思いました。 扱うデータ型が一種類だけならそれでもよいでしょう。ですが、データ型は数値系だけでもたくさんあり、.NETや独自のクラスも含めると数え切れないほどの型があります。それらをコレクションにまとめたところで、得られるのはGetTypeとToStringくらいです。それぞれのデータを正しく得るにはその都度CTypeしなければなりません。 異なるクラスを収められるコレクションは便利ですが、それはクラスやデータの「共通性」を利用するということ。個々の特徴・特性を廃し、ひとつのコードで効率を上げるという話です。 どこまでをコレクションにまとめて効率を上げるか、というのもプログラムによって判断すべき点ですので「オブジェクトの値はすべてコレクションから取り出すべき」と考えを固定化せず、柔軟に考えられるようにしたほうが良いですね。

rescue99
質問者

お礼

ありがとうございます。 コントロールズ=コレクション??? ControlsプロパティはFormを作成時に自動的に生成され、フォームで使われるオブジェクトがすべて格納されているわけですよね? この認識は合っていますか? >コントロールから値を取り出すのはコントロールによって異なります。 「コレクション」から値を取り出すのはコントロールによって異なるという解釈と同義になりますか? 異なるクラスのメンバをすべて扱えるコレクションは便利そうに見えましたが、共通性がある変数を持たせるといいことがわかりました。 プロシージャの一番上で宣言するpublicメンバだけコレクションにすると良さそうです。 あとは最適化のときに検討したいと思います。 毎度毎度ありがとうございますmm 大変為になります!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

> どういったときに使うのか この問いに関する答えを出すのは非常に難しいですね。それこそ千差万別。時と場合によってさまざまです。 私の経験則から言うと、 インターフェイス・ジェネリックなどは、処理の共通化・共有化・汎用性・多様性などを判断材料にします。 デリゲートは、拡張性・柔軟性などが判断材料でしょうか。 コレクションは、主にデータ管理の利便性ですね。 あるプログラムを組むとき、個々の場面でどの機能を使うのがよいか、という判断に一定の決まりはありません。 プログラマーの個性や個人差すらも関わってきます。 「どこで何を使うか」という判断を身につけるには機能・役割を理解するだけでなく実践的経験が必要です。 ここで用例を挙げることは可能ですが、用例とは常に、説明するのに都合の良いように組み立てられているものなので、実践的経験としては役に立たないでしょう。 使い方を教えるのは簡単です。 でも、考え方を教えるのは、とても難しいですね。 ひとつのヒントとして・・・ プログラムを組んでいるときに「同じようなコードを書いているな」「似ているけど微妙に違う処理だ」などと感じたら、その時に「もっと効率の良い方法はないかな?」と考えてみてください。その解決策を探る中で、今蓄えている知識が役に立つと思います。

rescue99
質問者

お礼

ありがとうございます。 フォームにボタンなど配置して、GUIを作って、機能を書いて、それから最適化を考えたいと思います。 初めからむずかしく考えずに作って、最適化のときに色々考えたいと思います。 値の格納方法について1つ聞きたいです。 フォームにあるオブジェクトはすべてコレクションに入ると書いていました。 なら、オブジェクトの値はすべてコレクションから取り出すべきだと思いますが間違っていますか? フィールドにメンバを格納する。フィールドをまとめるプロパティに格納する。すべてのメンバを束ねるコレクション。 オブジェクトは、構造型・列挙型を除いて、すべてプロパティ経由で値を格納して、取り出すのはコレクションから取り出したらいいと思いました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • デリゲートの使い方

    デリゲートはどのように使うのですか? 書き方はわかるのですが使いどころがいまいちわかりません。 何やら柔軟なプログラムが作れそうな気はするのですが。 使い方のサンプルをいくつか見たり、自分で考えたりしましたが、 そういった例は必ずしもデリゲートを使わなくても書けそうです。 デリゲート使わないと他に手段がないような使い方を教えてください。

  • c# イベント用デリゲートの引数

     こんにちは。c#初心者です。  今回はイベントに用いるためのデリゲートの引数に関する質問です。  通常、「System.Windows.Forms.Control」のイベントで用いられているデリゲートの引数は全て  void SampleHandler(object sender, SampleEventArgs e)  のようになっていますが、コントロール以外のクラス(System.Windows.Forms.Controlから派生しないクラス)、例えばコレクションクラスのようなものでも同じように「EventHandler<T>」デリゲートを使わなければならないのでしょうか?  それともう一つ質問です。コントロールクラスでのイベントの引数は  SampleHandler(object sender, …  のようにせずに  SampleHandler(SampleControl sender, …   としてはいけないのでしょうか? (いけないと思いますが…)  質問は以上の2点です。どなたか詳しい方がいらっしゃいましたら教えていただけませんか?

  • C++でデリゲート

    C#で仕事されている方から質問されたのですが、C++でデリゲートは利用できるのでしょうか? 私はC#を使ったことがなくC++の言語仕様も詳しくないので答えられませんでした。 ざっと話を聞いたところコールバックを手軽に利用できるという印象でした。 本質はC#を勉強してみようと思いますが、C++では利用できるのでしょうか?

  • VB2005でデリゲートというものを始めて使っています

    VB2005でデリゲートというものを始めて使っています。 いま困っているのは、メインスレッドのテキストコントロールのTextプロパティに、別のスレッドからデータをセットする場合、デリゲートという機能を使わないといけないということで、以下のようにしています。 画面上には別スレッドで書きこみたいTextBoxコントロールが沢山あり、 個々に(1)を記述しないといけないのでしょうか? txtTest部分の名前が違うだけですが・・・ デリゲードに関して初めて使っているのであまり理解できていませんが、数が多いと 面倒なので何か方法があるのではないか、質問しました。 詳しい方教えて下さい。 そもそも、別スレッドの書き込みでデリゲートを使う方法は駄目なのでしょうか? 'デリゲートの定義 Delegate Sub dlgWriteText(ByVal text As String) 'txtTestに書き込む ----- (1)   セットするコントロール毎にこれが必要??? Private Sub DlSettxtUserName(ByVal text As String)   Me.txtTest.Text = Text End Sub '別スレッド部分 dim data as String = "別スレッドでデータセット" '別スレッドで書きこむ Me.txtTest.BeginInvoke(New dlgWriteText(AddressOf dSetTest), data) よろしくお願いします。

  • VB.NETのデリゲートについて

    VB.NETのデリゲートについて質問です。 以下のプログラムなのですが、 デリゲート型をインスタンス化しているところで、コンストラクタにパラメータを渡していますが、 そのコンストラクタはどこに定義されているのでしょうか。 (AddressOf t1.Ohayou)というパラメータが渡されていますが、このパラメータを受け取っているコンストラクタがどれなのかが分かりません。 ご教示よろしくお願いいたします。 Delegate Sub Myprint(ByVal s As String) Module Module1 Sub Main() Dim t1 As Test1 = New Test1() Dim t2 As TEst2 = New Test2() Dim d As Myprint = New Myprint(AddressOf t1.Ohayou) d.Invoke("VB太郎") d = New Myprint(AddressOf t2.Konbanwa) d.Invoke("VB太郎") End Sub End Module Class Test1 Sub Ohayou(ByVal s As String) Console.WriteLine("おはようございます。{0}です。", s) End Sub End Class Class Test2 Sub Konbanwa(ByVal s As String) Console.WriteLine("こんばんわ。{0}です。", s) End Sub End Class

  • ガチャがたくさんあるトコロについてお聞きしたいです。

    ガチャがたくさんあるトコロについてお聞きしたいです。 ちょっと前のリボーンのガチャをやりたいのですが そういったのがドコにあるかわかりますか? 例えば、ボイスエッグとかボンゴレリング&匣チャームコレクションをやりたのですが 今じゃフツーのお店とか行っても、もうありません そういった、ちょっと前のも置いてあるところ知ってませんか? 是非、教えてください。よろしくお願いします。

  • ラムダ式とかデリゲートっぽい感じのことについて

    色々と調べてみたのですが 現状ではC#における List<int> ml = new List<int>(); ml.Add(111); ml.Add(121); ml.Add(310); Console.WriteLine(ml.Exists(t=>{ return t == 310;} )); 的なことをやろうとすると、一応このまんま「単純にあるかどうかとかだけ」なら final Collection<Integer> ml = new ArrayList<Integer>(); ml.add(111); ml.add(121); ml.add(310); System.out.println(ml.contains(310)); でも可能ですが、 独自のクラスで独自のデリゲートっぽい事をやろうとすると 例えば interface Func<T, R> { R Do(T t1); } class MyList<T>{ private List<T> list = new ArrayList<T>(); public boolean Exists( final Func<T,Boolean> deleg ){ for(T i : list) if ( deleg.Do(i) ) return true; return false; } public boolean add(T t){ return list.add(t); } } ////どっかの関数で///// final MyList<Integer> ml = new MyList<Integer>(); ml.add(111); ml.add(121); ml.add(310); //匿名クラスを作り、Doをオーバーライド final boolean b = ml.Exists( new Func<Integer,Boolean>(){ @Override public Boolean Do(Integer t1){ return t1.equals(310); }}); System.out.println(b); これぐらいの内容になってしまう と思うのですが( とくに面倒なのが、「new Func」からの、「同じ型の表記」が複数回登場してしまう ) だいたい今タイムリーにこの辺が改善されるかどうか というくらいのとこに行ってる感じで Java 7ではラムダ式が先送りになったみたいだけど 近々JavaでもC#(やC++11)っぽく出来るようになる可能性が高め なので、今からコードを書く場合には こういうところが絡む部分はまだ様子見しといて 採用された後でラムダ式を使って簡単に書こう と、いう判断にしといても良さ気ですかね?

    • ベストアンサー
    • Java
  • VB.NET デリゲートへのコールバック関数の設定

    VB.NET デリゲートへのコールバック関数の設定 VB.NETとネイティブC/C++ DLL間でのコールバックについての質問です。 ネイティブDLLからVOID*で得られるコールバック関数をVB.NETのデリゲートに 登録するには、どのようにコーディングすればよいのでしょうか。 ---------- VB.NETソース ---------- Public Delegate Sub CALLBACK_00(ByVal Arg1 As Integer, ByVal Arg2 As Integer) Declare Function FuncPtrGet Lib "test.dll" () As CALLBACK_00 Dim Func As new CALLBACK_00(FuncPtrGet()); 2行目は、実際にはVOID*が帰るDLL関数です。 3行目がコンパイルで通りません。AddressOfで関数を指定するようにメッセージが出ます。

  • c# デリゲート関連の命名について

     こんにちは。c#初心者です。  今回はデリゲート関連の命名についての質問です。 // ――――――――――――――――――――――――――――――― // 簡素化のため、フィールド変数のまま書いています public delegate int SampleDelegate(); public SampleDelegate SampleAction; public int Value {   get { return SampleAction(); } } // ―――――――――――――――――――――――――――――――  上記のようなコードを書いているのですが、「SampleDelegate」に当たる部分、「SampleAction」にあたる部分にはどのような名前をつければいいのかと迷っています。  SampleDelegateは値を取得するメソッドを表すので「GettingValue」や、「ValueGetter」がいいのか、それとも「ValuePasser」みたいなのがいいのか、それ以外がいいのか、  SampleActionも「ValueGetter」がいいのかそれとも、メソッドと同じように「GetValue」にするのがいいのかそれ以外がいいのかと悩んでいます。  最初は「SampleDelegate」が「GettingValue」、「SampleAction」が「ValueGetter」になっているのですが、反対の方がいいような気がしたり、その他いろいろで困っています。  どなたか詳しい方いらっしゃいましたら教えていただけませんか? できれば「『SampleAction』は動作自体だからGettingValueのように『~すること』 のように動名詞を使い方がいい」のように他の命名においても応用が利く教え方にしていただけるとありがたいです。

  • 古い刃物を安く売ってくれる所教えてください

    はじめまして! 古い刃物(例えばおじいさんが使っていた古い鉈や斧)とか 古い農具(鎌とか)とかコレクションしていますが、 古い大工道具なんかも好きですが 結局、刃物好きです 安価で買うにはどうしたら、良いでしょうか? 骨董市にも行って見ましたが高くて集められませんでした。 オークションでも高級すぎて結局高値になってしまうし・・・ 私は、錆びていても良いのですが・・・ 売ってくれる所は無いでしょうか?

このQ&Aのポイント
  • 月次集計表で実労働時間の合計が手計算より多い理由について
  • 休憩時間の集計も実際より多くなる理由について
  • フリーウェイタイムレコーダーの特徴と利点について説明します
回答を見る