ふらっとC#,C♯,C#(初心者用) Part65
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/11/09(火) 21:57:30「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からない場合など、勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
なお、テンプレ2行目が読めない回答者は邪魔なので後述のC#相談室に移動して下さい。
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっとC#,C♯,C#(初心者用) Part64
http://hibari.2ch.net/test/read.cgi/tech/1286890729/
■関連スレ
C#, C♯, C#相談室 Part62
http://hibari.2ch.net/test/read.cgi/tech/1284775031/
VB.NET質問スレ(Part35)
http://hibari.2ch.net/test/read.cgi/tech/1284423653/
くだすれC++/CLI(初心者用)part2
http://pc12.2ch.net/test/read.cgi/tech/1268613679/
■備考
コードの量が多い場合は下記サイトを使うなどしたほうがいいかも
http://ideone.com/
コードを貼り付けてRun codeのチェックをはずしてsubmitボタンを押すと
コードを鯖側にアップして専用のアドレスが発行されます。
直接貼る場合は下記サイトなどを利用してhtmlエンコードした方が
インデントも残って見やすいです
http://kawama.jp/php/encode_html.php
0153デフォルトの名無しさん
2010/11/12(金) 23:57:56AがBから呼ばれたいのだけどBはA専用には設計できない(設計したくない)、というとき
デリゲートかイベントを使う(と良い)
(さもなくば呼び出される側の詳細を隠蔽するためだけに継承と多態を使う、みたいなアホらしい設計になる)
で、BからAを呼び出すにあたり、呼び出し先がA一つで良いときはデリゲート、
Aだけとは限らず、Aがあずかり知らない不特定多数(CやDやE)も同じタイミングでの
Bからの呼び出しを必要としているかもしれない(Aにはわからない or わからせたくない)場合はイベントを使う
前者は昔はコールバックと呼ばれていたしくみ
0154デフォルトの名無しさん
2010/11/12(金) 23:58:15つLINQ
0155デフォルトの名無しさん
2010/11/13(土) 00:01:06class Form1 : Form {
// ...
void Foo() {
if (InvokeRequired) {
Invoke(new Action(Foo));
} else {
label1.Text = "Hello World!";
}
}
0156デフォルトの名無しさん
2010/11/13(土) 00:01:33Cで関数ポインタを使うぐらいの頻度。
要するに使う分野では使うけど、必用ない分野では殆ど使わない。
川俣はC#2.0の連載で匿名メソッドを「デザートじゃなくご飯」って書いてたけど、
あれは誇大広告もいいところでむしろデザートそのもの。
川俣はデタラメを言う「トンデモさん」ではないと俺は思うけど、
大げさで偏ってるのは確か。
0157デフォルトの名無しさん
2010/11/13(土) 00:01:510158デフォルトの名無しさん
2010/11/13(土) 00:05:14List<int> list = new List<int>();
list.Add(10);
list.Add(20);
list.ForEach(Console.WriteLine);
0159デフォルトの名無しさん
2010/11/13(土) 00:05:27「スレッドとかわかりにくい」と言われた・・・
そりゃ、「わからないからスレッド使わない、だからデリゲートも使わない」
と言われれば、「うん、使う必要ないね」としか言いようがなく。
0160デフォルトの名無しさん
2010/11/13(土) 00:07:27非同期局面でシグナルでなくデリゲートじゃなきゃヤダ、というのは大概このケース
つまんり、
int[] result = new int[10];
for (int i = 0; i < 10; ++i) {
Action<int> act = new Action<int>((x) => { result[i] = x; })
B.LetsCallback(act);
}
みたいな、
0161デフォルトの名無しさん
2010/11/13(土) 00:08:210162デフォルトの名無しさん
2010/11/13(土) 00:10:46デリゲートというか、ラムダ式はC#3.0以降は必須。
Linqの使い方を学べばデリゲートの有効な使い方ってのがよくわかる。
2.0以下だったらピンと来ないのも当然かもしれない。
0163デフォルトの名無しさん
2010/11/13(土) 00:15:41正直、デリゲートの概念なかった頃は冗談抜きで面倒よ。
簡単に説明してくれといわれて簡単に書く気になれないレベル。
だから例が出てこないのよ。
0164デフォルトの名無しさん
2010/11/13(土) 00:16:00たしかにw
0165デフォルトの名無しさん
2010/11/13(土) 00:17:56すわなち、引数付きコンストラクタしかないクラスTを型引数とし、内部でnewするテンプレートは
Tのファクトリをデリゲートで渡すようなテンプレートにするしか手がない、
ハズ…!
(引数なしのコンストラクタで生成するならnew()制約で良いが、引数付きを扱う構文が無い)
0166デフォルトの名無しさん
2010/11/13(土) 00:18:30仮にデリゲートがなかったとしたら
全部インターフェースとクラスで代用?
0167デフォルトの名無しさん
2010/11/13(土) 00:22:32そういう言い方されても俺には理解できない
>>151
List<T>もソートの意味もそれぞれわかるけど「List<T>のソート」とはどういうことかわからない
T比較用もよくわからない
よくある解説で、条件式のところにデリゲートを入れると便利的なことを書いているが
どうもピンと来ないんだよね
>>153
ちょっとまって、List 13-1でいうと呼び出し側はclass1で呼び出される側はclass2ですよね?
なんで「class1(classA)がclass2(classB)から呼ばれたい」という書き方しているの?
classABがどういうのか書いてくれないとわからない
ていうか、呼び出し側と呼び出され側の区別ってどうやってするの?もうわけわかんないよ。
>>156
その使う場面がわからない
>>157
それはわかりますよ
デリゲート使わないと無理だから
でも、そうでない場合の使い方がわからない
>>158
ForEachno定義が無いとしてエラーがでますが?なんですかそれは。
>>159
てことは、非同期以外では使わないというご意見ですね?
>>162
それって匿名メソッドとかそういうことなんでしょ
やっぱり2.0じゃ有用性説明できないってことですか
なんだろな、解説サイトあらゆるところみて一通り読んだのに
使われる場面が違うとさっぱりわからないな
頭がプログラマ向きじゃないのかなー
0168デフォルトの名無しさん
2010/11/13(土) 00:22:44ありがとう、いままでその方法に気づかなかった
0169デフォルトの名無しさん
2010/11/13(土) 00:23:50Java の場合は匿名クラスってのが実質的にデリゲートの役目担ってて、まだマシ。
ものすっごいコード量増えるけど。
C++ とかだと悲惨。
インスタンスメソッドでなければ、関数ポインターっての使えば簡単っちゃ簡単なんだけど、
インスタンス持たせようとした瞬間酷いことに。
あと、循環参照つきものだからメモリ管理がすごく面倒になる。
0170デフォルトの名無しさん
2010/11/13(土) 00:25:40>>146 に書かれてる例、ものすごい頻出パターンよ。
それみて、使いどころ分からないとなると、頻出パターンすらわかってないことになる。
0171デフォルトの名無しさん
2010/11/13(土) 00:25:53「解説サイトあらゆるところみて一通り読んだ」のに「何一つ頭に入ってない」ね。
0172デフォルトの名無しさん
2010/11/13(土) 00:27:55C#選んでよかった
ところでWPFのコンバーターなんかもクラスじゃなくてデリゲート渡せたらなあって思うんだよね
0173デフォルトの名無しさん
2010/11/13(土) 00:28:09多分そうじゃないかな。
WPFの時もデリゲートわかんないって言ってて、
周りから「デリゲートもわからないってやばい」って言われて、
それで今に至ってるっぽい?
普通にやってたら頻出するはずのパターン見て「何が便利かわからない」って言ってる辺りもそっくり。
0174デフォルトの名無しさん
2010/11/13(土) 00:29:030175デフォルトの名無しさん
2010/11/13(土) 00:30:16マジでいってんの?
0176デフォルトの名無しさん
2010/11/13(土) 00:31:41XAML って仕組み的に、シリアライズ可能なものでないと書けないからね。
デリゲートは相性よろしくない。
0177デフォルトの名無しさん
2010/11/13(土) 00:33:21WPFスレではコテハンになったぞw
0178デフォルトの名無しさん
2010/11/13(土) 00:36:48これがなかったら、ICommandインターフェースを使った
クラスをそれぞれのコマンドごとに作らなくてはいけなくなる
だから、ICommandインターフェースを実装したDelegateCommandクラスを作って
デリゲートを通して、実処理部分のVMのメソッドはここですとDelegateCommandクラスに渡して
DelegateCommandクラスから、VMのメソッドを呼びなおしてもらうと
そのことによって、イベントハンドラごとにクラスを作らなくても良いようにしている
つまり、共通的な処理部分をデリゲートで呼び出したほかのクラスのメソッドに処理させて
相違部分は呼び出し元で処理する場合に便利ってことなんだろうけど
これも、インターフェースが必要としない場合だと、ただ共通機能をまとめた
メソッドを作って直接呼び出せばいいだけだし
0179デフォルトの名無しさん
2010/11/13(土) 00:40:53それはわかってるんだけどコンバータクラスが大量に増えてしまう現状は何とかしてほしい
なんかうまい方法とかないかな
0180305 ◆Jzt/EX0TGY8T
2010/11/13(土) 00:50:19それこそDelegateCommandと同じ要領でいけるでしょ
コンバータークラスを1つ作っておいて
デリゲートでVMなどの実処理するメソッドを呼び出してもらう
0181153
2010/11/13(土) 00:53:32言った手前返事しとこうとぞ思う、
>153は、List 13-1(>129のさらにリンク先)と異なる記号を使って無用の混乱を招いた点はお詫びしとく
List 13-1は非常に単純化されたサンプルなので、>153に当てはめて解釈するのは無理がある
Class2のインスタンスinstanceはClass1から呼び出されてはいるものの、instanceが特にそういう要求を持っているわけではない。
すなわち、instanceはClass1から呼ばれようが呼ばれまいが自己不整合を起こして破綻したりしない。
このような、Class2を知っているClass1が一方的にClass2を呼び出す場合はデリゲートを使うまでもない。
実際、List 13-1の19〜20行目はただ単に instance.method(2, 3); と1行書けば済む
だがそうは済まないケースがあり、それが>153だったり>157だったりするというしくみ
わからないのは必要に迫られていないからかもしれない、
0182デフォルトの名無しさん
2010/11/13(土) 00:55:05なんだ、わかってるじゃないか
ここ見ても、イベントと非同期はわかりますよ
デリゲートなければできないですから。
イベントの場合、ボタンクリックで例えると
イベントハンドラを作る我々開発者はクリックイベントが起きた場合に
このメソッドを呼び出してほしいとイベントハンドラを代入して呼び出してもらう
でも、イベントハンドラを書かないでクリックされても無反応であってもいい構わないわけで
こちら側にすべての処理を委ねられているって感じがします。
でも、List 13-2にしても、上記のURLの図2にしても
普通に処理するメソッドを直接書けばいいだけなのを
わざわざデリゲートで呼び出している理由がわからない
>>181さんの言うとおり「必要に迫られていないからかもしれない」ってことなんだろうけど
>>181
その説明はすごくわかりやすかったです。
で、その説明で>>153を説明するとどうなりますか?
いやでも、それはインターフェースを実装しなければいけないという
制約があるから、デリゲートするしかないってのはわかるけど
例えば、インターフェースなくてもいいってのなら・・・
あれ?やっぱりクラスが増えることになるか・・・
いやいや、違うな
この場合は、呼び出し側がマイクロスフトの設計によるものだから
つまり、ボタンを設計したマイクロソフトであり、コンバーターやコマンドを作ったマイクロソフトが呼び出し側
呼び出し側も呼び出される側も自分で設計する場合は
やっぱり普通に直接メソッド呼び出すよね
だからデリゲートの有用性がわからないんです
0185デフォルトの名無しさん
2010/11/13(土) 01:18:40これならデリゲートのありがたみがわかるんじゃないか?
わざわざ自分で実行しなくても下のほうに結果も表示されるようになってるからね
0186デフォルトの名無しさん
2010/11/13(土) 01:18:440187デフォルトの名無しさん
2010/11/13(土) 01:22:090188デフォルトの名無しさん
2010/11/13(土) 01:24:38必要性を感じない人に理解させるのは難しい。
0189デフォルトの名無しさん
2010/11/13(土) 01:25:56無理して教える必要はないw
どうせ聞く方も身に付かないだろうし
教える方も疲れるだけw
会社の後輩だったら業務命令等あるだろうけどw
0190デフォルトの名無しさん
2010/11/13(土) 01:27:450191デフォルトの名無しさん
2010/11/13(土) 01:47:19>イベントハンドラを作る我々開発者はクリックイベントが起きた場合に
>このメソッドを呼び出してほしいとイベントハンドラを代入して呼び出してもらう
これは、「開発者のコード」が、ボタンクリック時の処理を、我=「開発者のコード」に属するイベントハンドラに委譲せよ、と「ボタン」迫るケース。
しかし「ボタン」を実装したコード自体はマイクロソフト謹製でかつビルド済みだから、開発者側はそれを改変できない。
だから「「ボタン」が「開発者のコードを直接呼び出せばいいのに!」という系の願いは叶えられようがない。
こういうとき、イベントハンドラのコードをデータのごとく「ボタン」に渡せて初めて解決する。デリゲートはその入れ物。
なお、「ボタン」を作るのがマイクロソフトでなくて今日の漏れで、「開発者のコード」を書くのが3000年後の漏れだとしても約同じ事
これが>153の説明。「ボタン」は「開発者のコード」専用には設計できない。
>>184
>呼び出し側も呼び出される側も自分で設計する場合は
>やっぱり普通に直接メソッド呼び出すよね
例えばだが、switch文x=1,2,3,...,10000に応じて自作関数1万個のどれかに分岐する1万行のコードのかわりにデリゲート1万個の配列をつくっておけば
呼び出しは1行で済むし、
一方、デリゲートに収容するコードはデータとして生成もできる(>160)から、初期化には1万行要らない(かもしれない)
0192デフォルトの名無しさん
2010/11/13(土) 01:52:49(デリゲートは使ってる立場ですけど)
これはデリゲート使ってないやり方ですよね?
このままでいいと思いますけど、何がだめなんでしょうか?
persons.Sort(compareAge).Select(s=>Console.WriteLine(s));
DelegateCommandに習うとするなら
実装を変えたくないClassAがあるという大前提で
ClassAのプロパティであるClassBの処理で計算結果が出される場合
ClassBの処理をいくつか変更したくなった場合に
ClassBにデリゲートを設けて、C,D,Eを呼び出して処理を変更するために
デリゲートを使うというのならわかる
でも、これはあくまで一部の使い方なんだよね
ラムダとかでデリゲート使ってるのみると、上記のようなことを
頭に浮かべながら考えるなんて大変すぎる
0194デフォルトの名無しさん
2010/11/13(土) 01:57:180195デフォルトの名無しさん
2010/11/13(土) 01:58:08いやいやいやいや
デリゲートつかってますよ?
0196デフォルトの名無しさん
2010/11/13(土) 02:00:10デリゲートなんて一次接近としてはただの関数ポインタだと理解すればいいわけで、
そんな難しい概念じゃないんだけどね。
機械語だったら今まで
CALL #label
と即値のアドレスしかコールできなかったのが、
CALL funcPtr
と、メモリーのどこかに入ってるアドレス値を参照してコールできるようになりましたよ、
とそれだけの話。
実行時に呼び出しアドレスを動的に変えたい場合があるって、そんな高尚な話か?
0197デフォルトの名無しさん
2010/11/13(土) 02:05:25「関数ポインタが安全に使えるようになりました」だった。
0198デフォルトの名無しさん
2010/11/13(土) 02:05:54アプリケーションに取っては、スレッド間通信が本来の使い方でしょ。
参照コールの機能もあるけどね。
>例えばだが、switch文x=1,2,3,...,10000に応じて自作関数1万個のどれかに分岐する1万行のコードのかわりにデリゲ>ート1万個の配列をつくっておけば
>呼び出しは1行で済むし
1行で済みますか?
デリゲートは
Sample sample = new Sample(instance.method);
こんな風に直接メソッドを指定してデリゲートに登録するんですよね?
つまり、分岐の数だけ、別クラスの特定のメソッドをデリゲートに登録する記述を書かなくてはいけないですよね?
例えばDelegateCommandのようにプロパティとして渡して置くというのなら
1行で済むでしょうけど
0200デフォルトの名無しさん
2010/11/13(土) 02:07:200201デフォルトの名無しさん
2010/11/13(土) 02:07:39デリゲートは関数ポインタよりも高尚な概念なんですよ^^
クロージャでもあるっていうのがその証拠
デリゲート=関数ポインタ、は正しくない
デリゲート=関数ポインタ+無名関数、は冗長
0202デフォルトの名無しさん
2010/11/13(土) 02:08:03persons.Sort(new Comparison<Person>(compareAge));
こう書けばわかる?
Comparison<T>はデリゲートね
ちなみにSortの返り値はVoidだし
Selectも遅延実行だから何も表示されない
>>197
こういう説明の仕方が一番嫌いです。
わざとなんでしょうけど。
ある未知の機能を説明するのに、未知の機能を例にする説明ってよくないと思うの
読んでる側は0の知識の可能性があるのに。
>>195
デリゲートの宣言ないですけど
0204デフォルトの名無しさん
2010/11/13(土) 02:15:05Select(x => x * x) ってのは
Select(new Func<int,int>(x => x * x) であり
static int Hoge(int x) { return x * x; } // というメソッドが外に定義してあって
Select(Hoge) とも同じであり
Select(new Func<int, int>(Hoge)) でもあり
var delg = new Func<int, int>(Hoge); // 代入して
Select(delg); // こう使ってもいい
になる。
匿名関数じゃないデリゲートがビミョーって主張なら、まあ分かる。
0205デフォルトの名無しさん
2010/11/13(土) 02:15:22クロージャになったのは.NET2.0から。
0206デフォルトの名無しさん
2010/11/13(土) 02:18:05未知って、だから関数ポインタがどういうものかもちゃんと説明してるじゃん。
デリゲートより関数ポインタの方が具体的だから、そっちをまず理解するんだよ。
関数ポインタがわからないのにより抽象度が高いデリゲートが分かるわけないだろう。
0207デフォルトの名無しさん
2010/11/13(土) 02:18:13一番単純な概念から説明しようとしてるだけだろ。
>こういう説明の仕方が一番嫌いです。
なんて言い訳して逃げるからいつまで経っても理解できないんだろうがw
0208デフォルトの名無しさん
2010/11/13(土) 02:19:47ごめんね、そこまで書かないとわかんないとは思わなかったんだよ
>>202にも書いてあるけど
public delegate int Comparison<T>(T x, T y);
っていうデリゲートがSystem名前空間に定義されてるんですよ
で、SortはこのComparison<T>を引数にとる。
persons.Sort(new Comparison<Person>(compareAge));
で2.0からはわざわざnewする必要がなくなったから
persons.Sort(compareAge);
って書き方になるわけです。
0209デフォルトの名無しさん
2010/11/13(土) 02:23:58そんなゲームに思えてきた
うーんわからないです
Sort()メソッドの実態は
Array.Sortを使ってある条件に基づいてソートすると
そのソート条件をcompareAge(Person a, Person b)で示していると
で、デリゲートがなければ、Array.Sortを直接呼び出してソートすればいいだけですよね?
0211デフォルトの名無しさん
2010/11/13(土) 02:26:170212デフォルトの名無しさん
2010/11/13(土) 02:27:23「直接呼び出してソートすればいい」
どうやって条件を指定するの?
デリゲート使ったのは
「そのソート条件をcompareAge(Person a, Person b)で示している」
ためなのに。
0213デフォルトの名無しさん
2010/11/13(土) 02:35:10じゃあ仮にデリゲートを使わないとしたら
Persons.Sort()の実行結果はどんな並び方になると思う?
関数ポインタって関数が書かれているメモリアドレスじゃないんですか?
よくわかりません。
>>204
なんとなくわかるんですが、
それなら、Hogeを改名してSelectにして直接使えばよかったのでは?と思うのです
つまり、Selectメソッドの実態には、hoge(int x)を呼ぶかhoge(int y)を呼ぶかの選択肢があるってこと?
でも、それはオーバーロードでいいですよね?
>>207
いやでも、自分で調べろよじゃ解説になってないってことを宣言していることだと思いますよ
>>208
ってーことは
内部がList 13-2みたいなことになっているってことですよね?
calcがSortみたいな感じですか?
つまりSortを利用する側は記述が少なくて済むと・・・
sortを利用する側は呼び出し側ということでいいですか?
?
デリゲート使う使わないに関係なく
Sortメソッドが利用しているアルゴリズムを直接使えば同じことでは?
0216デフォルトの名無しさん
2010/11/13(土) 02:46:16掲示板の少ない分量で、知識0で理解する気のない奴に解説しろ って無理ゲーにもほどがあるだろ。
>>139
0218デフォルトの名無しさん
2010/11/13(土) 02:48:070220デフォルトの名無しさん
2010/11/13(土) 02:51:230222デフォルトの名無しさん
2010/11/13(土) 02:52:54根本的に何もかも分かってないのに、あれこれ調べたお陰なのか、
ご立派な言葉だけは並べられるみたいでよくないね。
0223デフォルトの名無しさん
2010/11/13(土) 02:53:50少しでも実行してみれば自分がどれだけ変なこと言ってるか気づくと思うのだけど。
0224デフォルトの名無しさん
2010/11/13(土) 02:56:06そうですSortはcalcに相当しています
ソート用のアルゴリズムと、要素の比較方法が分離可能なら
いろいろなところで使いまわせるでしょ?
0225デフォルトの名無しさん
2010/11/13(土) 02:57:12>>210
やっぱあほ杉わろた
0226デフォルトの名無しさん
2010/11/13(土) 03:04:54自分は頭いいのに理解できないのは説明がよくないからって考えてる。
だからここに書かれた説明にちょっとでもわからない部分があるとすぐ攻撃的になって、
あらさがしや、わからないのはお前の説明が悪いからという態度になる。
そうやって自分の無能さから目をそらしているだけ。
0227デフォルトの名無しさん
2010/11/13(土) 03:07:190228デフォルトの名無しさん
2010/11/13(土) 03:08:100229デフォルトの名無しさん
2010/11/13(土) 03:11:04それなら◆Jzt/EX0TGY8T は天才的な才能の持ち主だな
0230デフォルトの名無しさん
2010/11/13(土) 03:14:530231デフォルトの名無しさん
2010/11/13(土) 03:18:39まじかー、そりゃいっぱいやられたな
開発者マジすげー、尊敬するよ
0232デフォルトの名無しさん
2010/11/13(土) 03:23:240233デフォルトの名無しさん
2010/11/13(土) 03:25:28ユーザーに簡単な数式みたいなやつを入力させて、
プログラムの動作を変更するみたいなことできる?
0234デフォルトの名無しさん
2010/11/13(土) 03:28:47式ツリーをビルトできるんだから出来る
0235デフォルトの名無しさん
2010/11/13(土) 03:29:120236デフォルトの名無しさん
2010/11/13(土) 03:39:11ありがと、ちょっと調べてみるよ
しかし何でこの記事真っ白なんだ?
http://msdn.microsoft.com/ja-jp/library/bb882637.aspx
ConverterはBindingできませんとかww
どうすりゃいいんだよー
0239デフォルトの名無しさん
2010/11/13(土) 04:53:29イベントを発生させるメソッドの命名規則としてOn〜ってするのは割とよくあると思うんだけど
(protected virtual OnLoaded(){ this.Loaded(〜); })
イベントを受け取る側のメソッドの名前ってどんなふうにつけてる?
標準ライブラリ見ると受け取る側もOn〜って名前になってたりするんだけど
なんか一緒っていうのも気持ち悪いし
CallBackとかじゃないのHandlerとか
寝ようとしたが閃いた
例えば、サイトから画像をダウンロードするソフトを作る場合
サイトによってダウンロードの仕方が違う
その相違部分をダウンロードするクラスに教えてやるためにデリゲートを使うって感じかな
でも、多態性でもできそうだよね・・・・うーん
0241デフォルトの名無しさん
2010/11/13(土) 06:00:57不要な画像(広告とか)のURLをフィルタリングするデリゲートを後から注入できるように設計しとくと便利かもね。
外から後で実装を注入できるのはデリゲートの重要な使い方の一つ。
例えばコレクションのソートでは、並び順を中身のクラスや状況によって変えたいケースは多いと思う。
そんな時にデリゲートが使えないとIComparerを実装したクラスを何度も作る羽目になっちゃうでしょ
>多態性でもできそう
単純な処理を各クラスに割り振ると数が増えすぎて複雑になってしまう。
でも複雑な処理ならクラスにする方が見通しがいい。
その辺のさじ加減はやっぱり経験になるけど、目安としては多態性で抽象化されるメソッドが複数ならインターフェイス、単一ならデリゲート
0242デフォルトの名無しさん
2010/11/13(土) 06:11:40その説明すごくわかりやすい
要は汎用的に使えるクラスがあるという大前提に基づいて
話を進めていかないとだめなんですよ
汎用的なクラスに固有の機能をつけて利用するためにデリゲートを使うと
クラスライブラリを作るとかさ、そういう前提の話じゃないこれって
それを@ITはMAINクラスを汎用クラス的な扱いにしているからわかりにくかったんだよ
それに、calcメソッドをclass1に入れているのもよくないね
あれはclass2にするべき、そしてclass2のメソッドをclass1でやらないとだめでしょ
例えるとclass2を電卓として、class1が入力する側という感じでコードを書けばわかりやすい
説明するのに専門用語でずらずらっと並べられてもわからないんですよね
初心者はすべてのライブラリや文法を理解しているわけじゃないんだから
できるだけ日常使うような言葉だけで説明してほしい
0244デフォルトの名無しさん
2010/11/13(土) 06:49:33もっと簡潔にいうと
@ITのサンプルコードは
IDEやアドオン、プラグイン対応のアプリを開発するための雛形なんだよ
初心者がそんなこと想定して作るかっつーの
0246デフォルトの名無しさん
2010/11/13(土) 07:02:31やっぱり何考えてるのか分からない
0247デフォルトの名無しさん
2010/11/13(土) 07:07:530248デフォルトの名無しさん
2010/11/13(土) 07:14:58Callbackとイベントは混同したくない
Handlerはデリゲートの名前に使うからかぶらせたくない
何かほかにありませんか?
0249デフォルトの名無しさん
2010/11/13(土) 07:31:20>>146の「述語: 条件式を外から挿す」を読んだだけで
汎用的なものに具体的な処理を注入するって発想にいたると思うんだけどなぁ
0250デフォルトの名無しさん
2010/11/13(土) 07:38:24「そこ読んだけどわかりづらい、解説されてない、例えが悪い」
ばっかりだもん。説明してる人、お疲れさまです。
その考え方が既にプログラミングがわかる人のものの考え方であって
例えば、全く知らない分野について、汎用的なものって言われてもわからないでしょ?
汎用的という言葉の意味はわかっていても、分野によってまったく内容が違う
CAD設計において汎用的なやり方って言われてイメージできますか?
汎用的なものすらプログラミングしたことのな初心者にとっては理解できないんですよ
今で作ったソフトは、ソートも必要ないし、イベントに対して直接動作を書き込んで
できちゃうようなプログラミングばかりだったので、デリゲートの概念なんて意識しないで使っていた
0252デフォルトの名無しさん
2010/11/13(土) 08:01:10汎用的って表現はあなたの>>243から借りて使ってるんだよ
■ このスレッドは過去ログ倉庫に格納されています