- PR -

特集「私がJavaからC#に乗り換えた10の理由」について

投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-07-19 01:40
上位クラスと下位クラスを結ぶもの・・・。
結べないものを結ぶとき・・・だからクラスなのかな??
もしそれが理由だとすればJavaのシンタックスはシンプルですね。

# こんなもんにつけたすこともないのですが(汗)

class 自動車{
class 信号{
}
}
という感じ。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-07-19 02:02 ]
Izumi, Y.
ベテラン
会議室デビュー日: 2002/03/19
投稿数: 77
お住まい・勤務地: 東京
投稿日時: 2003-07-19 05:46
何というか、ものすごい議論が繰り広げられていますね。

このスレッドの途中まで読んで、委譲とは「物事を他者(ほかのオブジェクト)にやらせること」ととれました。「他者」と書いていますが、厳密には自分自身でも可です。(これはすぐ上の英-Ran さんの記事にある「(データではなく)処理を受け渡し実行してもらうこと」という表現と本質的に同じことをいっていると思っていますが、間違いがあれば突っ込んでください >英-Ran さん)。

で、ほかに物事をやらせるにはその物事たるものを教えなければならないわけですが、その教える方法としてデリゲート(.NET)、メソッドオブジェクト(Ruby?)、匿名インナークラス(Java)などがあると。

クラス(匿名インナークラスを含む)を利用する場合は、そのクラスのインスタンスを他者に渡すことになりますね。で、インスタンスを渡されたほうは、そのインスタンスに実装されているインターフェイスのメソッドを参照して、やるべきことを実行すると。

デリゲートはたぶん Delphi 言語のメソッドポインタ型を引きずったものだと思います。具体的には、デリゲートはあるオブジェクトのメソッドへの参照をかくまう型です。最初、メソッドオブジェクトとの区別がつかなかったのですが、よく考えると、デリゲートはわざわざ new SomeDelegate(someMethod) のように、わざわざメソッド(の参照)を渡してインスタンスを作るわけだから、先のような定義を考える方が自然なわけで、メソッド自体をオブジェクトとみなすメソッドオブジェクトとは異なりますね。

で、このスレッドを読み始めてから感じていることなのですが、ひょっとして COM・API 絡みなのでは?と思っています。というのも、実はイベント、API のコールバック関数の代替物としての利用以外に、デリゲートを利用する場面をほとんど知らないからです。例えば、Array.Sort は比較演算子の委譲が可能ですが、そのときに渡すのはデリゲートではなくてインターフェイスのはずです。

Java に関してはかなり無知なので、間違いがあったら突っ込んでください >Java に詳しい方々


[ メッセージ編集済み 編集者: IZUMI Yusuke 編集日時 2003-07-19 05:48 ]
Izumi, Y.
ベテラン
会議室デビュー日: 2002/03/19
投稿数: 77
お住まい・勤務地: 東京
投稿日時: 2003-07-19 07:12
引用:

IZUMI Yusukeさんの書き込み (2003-07-19 05:46) より:
デリゲートはたぶん Delphi 言語のメソッドポインタ型を引きずったものだと思います。


と書いてしまったけど、Delphi のメソッドポインタ型はメソッドを直接参照するから、むしろメソッドオブジェクトに近いような気がしてきたぞ…
ついでに言うと API のコールバック関数もメソッドオブジェクトでマーシャリングすれば済むことだし…
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2003-07-19 07:39
objectです。

>IZUMI Yusukeさん
コード:

c1.SampleEvent += c2.Sample_Handler; (a)
c1.SampleEvent += new Method(c2.Sample_Handler); (b)


(a)(b)は、基本的には、同じだと思います。
(b)は「c2.Sample_Handler」をMethod型として処理しているだけだと思います。
わざわざ(a)と書ける部分を(b)の様に、意味も無くC#の作製者のヘジ(Anders Hejlsberg)がやると思いますか?
コード:

public event Method(object sender, EvnetArgs e) SampleEvent; (c)
c1.SampleEvent += c2.Sample_Handler;

public delegate void Method(object sender, EvnetArgs e); (d)
public event Method SampleEvent;
c1.SampleEvent += new Method(c2.Sample_Handler);


結局は上の違いが表面化しただけだと思います。
(c)の形は、一見分かり易いと感じます。
でも、不完全なのです。
例えば、(c)の「SampleEvent」をメソッドの引数にする時、どの様に書けば良いのでしょうか?
メソッドの仮引数内に、
コード:

void DoSomething(Method(object sender, EvnetArgs e) sampleEvent) {}


と書けという事でしょうか?
これから分かる様に、(c)の形式、つまり「メソッドシグニチャ」で直接「イベント」の定義をしたとしても、メソッドの引数にさえ出来ないという中途半端な状態になります。
これを解決するには、(d)の様に、一旦、「型」として明確に宣言しておく必要があるのです。

だから、私は何故「型」でないと駄目なのかと、どこかで問いかけた事があると思います。
もし、(c)を「メソッドオブジェクト」と言っているのであれば、基本的な間違いです。
メソッドは、(d)の形式を経る事によって初めて、C#に於いてより完全な「メソッドオブジェクト」になっていると考えるべきです。

※「event」を型付けする事の重要性は、「Delphi」で既に認識されていると思います。

因みに、同じ「イベント」を「Delphi」で定義すると
コード:

MethodEvent = procedure(sender: object; e: EvnetArgs) of object;
SampleEvent : MethodEvent;


の様になります。


[ メッセージ編集済み 編集者: object 編集日時 2003-07-19 09:49 ]
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-07-19 09:58
直接関係ない内容のため削除しました。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-07-21 16:43 ]
英-Ran
ベテラン
会議室デビュー日: 2002/06/12
投稿数: 55
投稿日時: 2003-07-19 11:53
引用:

objectさんの書き込み (2003-07-19 07:39) より:
objectです。

(b)は「c2.Sample_Handler」をMethod型として処理しているだけだと思います。



そう思っているのなら、他のプログラミング言語を多少なりとも学んでみてはいかがですか。

引用:

これから分かる様に、(c)の形式、つまり「メソッドシグニチャ」で直接「イベント」の定義をしたとしても、メソッドの引数にさえ出来ないという中途半端な状態になります。



なぜ出来ないのです? Methodオブジェクトはfirst Class Objectですよ。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2003-07-19 12:03
引用:

英-Ranさんの書き込み (2003-07-17 22:26) より:
オブジェクト指向が生まれてからもう30年以上経つのですが? 何も知らないくせに、知ったかぶりをして発言をしないでください。オブジェクト指向を批判するのであれば、あなたの天才的な頭脳を駆使して、それを上回る概念を提出してください。出してくれるなら、それに関しておおいに議論しましょう。


技術的内容ではないですが、このレスが掲載されて、かなり経過します。
この様な技術的議論の内容から逸脱した、個人を非難する文章は
「本人に謝罪をさせ、その後訂正・削除」
をして頂きたく、ここの編集者に要求します。(これ以外にも存在します。)
※私は、この要求が通れば、この文章自体はこのスレの内容には直接関係ありませんから、削除します。

私自身は、この発言者と直接話をする意思は全くありません。
ご無礼をお許し下さい。
英-Ran
ベテラン
会議室デビュー日: 2002/06/12
投稿数: 55
投稿日時: 2003-07-19 13:04
@IT管理者の方へ

ここの会議室への書き込みは@ITさまの著作物になるそうですので、もしも客観的に見て私の書き込みに問題があると思われるのならば削除していただいてかまいません。

ただ、削除するのであればこの会議室で私の発言した内容すべてを削除するようお願いします(あくまでお願いです。私は要求する権利を持たないので)。どれもJava信者のたわごとですので、なくなったとしても誰もこまることはないでしょう。

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