- - PR -
VB.NETからC#のFormを継承した際のイベント処理
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-19 12:19
objectです。
私も「Jitta」さんと同じ意見です。 でも、「ブギウギ」さんの「知識不足」というより、私は「VB.NET」の問題という気がしてなりません。 最初に、「VB.NET」で学ぶ人と、「C#」等で学ぶ人では、考え方の基本的な「カテゴリ」が違ってしまう様な気がします。 「VB.NET」の継承の修飾子 Inherits NotInheritable MustInherit は、「継承」という点から言えば、確かに一貫性のある言葉になってるかも知れません。 でも、「C#」「Java」系で「abstract」という言葉で何かを議論している時に、「MustInherit」という言葉で同じ議論に参加出来るのか私は疑問に思います。 Overridable Overrides NotOverridable MustOverride に関しても同じですね。 確かに「Override」出来るかどうかは大切な事です。 でも、「C#」の場合「VMT」の存在をベースに考えている訳です。 ここでも、矢張り言葉の概念に対するずれを感じます。 「VB.NET」で最初にオブジェクト指向を始めた場合、独立な概念とその関連が、アクセス修飾子を通して本当に自然に出来上がっているのでしょうか? #「Java」の場合、確かに「virtual」「override」というキーは無いですが、概念としては持っているようですし、全体の議論としては噛み合いますよね? 「VB」は、言語以前に、一番大切な概念を軽視している様に思います。 「VB」「VB.NET」開発者は、余りに言語の裏にある概念を軽く考え過ぎではないでしょうか? 「VB」系とその他の言語使用者との違和感は、ここに全ての原因があると私は思います。 #話がかなり横道にそれてしまいました。 #済みません。m(__)m | ||||||||
|
投稿日時: 2004-02-19 13:37
確かにこれはありますね。 C#の方が正しいかというと、それも微妙なところがあるようには思いますが。 .NET Framework としての正しい意味合いってどこかに定義されていましたっけ? 今回の問題に関しては、VB.NETのデザイナによるイベントハンドラ定義が、C#と異なるのが原因になっています。…これは、…使う側ではどうしようもないですね… はっきり言ってVB.NETのWithEventsとHandlesによるイベントハンドラ定義は気持ち悪いです。 特に勝手にプロパティになってくれてたりするところが… | ||||||||
|
投稿日時: 2004-02-19 14:01
個人的にはデザイナを使わない場合でもなるべくはWithEventsを使うようにしています。 VBが元々持っているイベントの取り扱い方式ですし、コードがすっきり書けます。 またHandlesの指定があるため、どのプロシージャがどのイベントのハンドラに なっているかが一目瞭然です。これはWithEvents&Handlesのよいところだと思います。 単なるシンタックスシュガーですが、十分なメリットがあります。 C#にもusingステートメントのような便利なシンタックスシュガーがありますし、 VBだからというものではないと思います。 後、VB.NETとC#でWithEventsだけ違うようにしてソースコードを起こして作成したEXEを ILDASMで調べてみるとILコードとしてもWithEventsという言葉が出てきているので、 ILレベルでサポートしているように見受けられます。
プロパティ化して、インスタンスSet時に、 そのインスタンスのイベントに(Handles句が付いている分の)ハンドラをAddし、 NothingのSet時に、そのインスタンスのイベントからすべてのハンドラをRemoveしているんでしょうね。 [ メッセージ編集済み 編集者: よねKEN 編集日時 2004-02-19 14:09 ] | ||||||||
|
投稿日時: 2004-02-19 15:12
まぁ、 http://www.atmarkit.co.jp/fdotnet/onepoint/onepoint01/onepoint01_01.html こちらで指摘されていることもあわせて、.NET Frameworkの問題ですね。 VB.NETは「レガシー」な部分がありますから、それをどこまで残しながら、新しいものを付け足していくか、というところで苦労したのでしょう。 ただ、レガシーには「遺産」というプラスなイメージの他に、「時代遅れ」というマイナスなイメージもありますが。。。 | ||||||||
|
投稿日時: 2004-02-20 12:22
objectです。
「クロス言語開発は本当にできるのか?」の少なくとも前半部分は、 「VB.NET」ユーザーがメソッド「Show」に多態(ポリモーフィック)な動きを期待している様ですが、「Show」は「virtual」ではありません。 問題は「多重定義」ではなく、「Show」が仮想になっていない設計の問題だと思います。 それから、私は「ボーランド」の「VCL」の「Delphi」と「C++Builder」のユーザーでしたが、 「クロス言語開発が副作用」 という主張も私には同意出来ません。 「VCL」では、「C++Builder」が出荷された後でも確か「イベント」周りの変更がありました。 一つのクラスライブラリで多言語に対応する事は、「副作用」として実現出来る程容易な事では無いと私は思います。 結局オブジェクト指向と同じで、 「.NET Framework」を使えばどんな使い方をしても、「クロス言語開発」が出来る 程単純では無いというただそれだけの事ではないでしょうか? それから、完全なクラスライブラリは何処にもないと思います。 断っておきますが、前のレスで私は 全ての概念が全く同じでなければいけない と言っている訳ではありません。 #それでは、個々の言語の意味が無くなります。 でも、絶対に同じでなければいけない概念があると思います。 それを問題にしています。 私が「abstract」と「virtual」「override」に関して書いたのは、そういう意味です。 ここのスレに関して、もう少し具体的に言えば 私は、「クラス」に関して「プロパティ」と「メソッド」は、最も基本であると思っています。 簡単に言えば、「イベント」は「デリゲート型」の「プロパティ」です。 つまり、「イベント」は、「データ」である訳です。 従って、それへの設定は、左辺値として表記出来る所、つまり直接代入出来る所に良さがある訳です。 しかし、「.NET Framework」での「イベント」はマルチキャストだった。 それに対して、「C#」は「+=、-=」と使った。 でも、「VB」には、それに対する概念が無い。 マルチキャストイベントだから、代入(=)では不十分である。 従って、「AddHandler」を使った。 でも、これでは結局 VBの設計者は「プロパティ」を理解してない という事に他ならないと私は思います。 それから、「VB.NET」は「オブジェクト指向」言語として生まれ変わった訳です。 中途半端に「遺産」を守る事が一番いけないと思います。 「VB」の設計者は、何が大切なのか、それが分かっていない様に感じますね。 #少なくとも、「クラス」「プロパティ」「メソッド」の「what」「why」に関係する部分は、概念を統一すべきだったと私は思います。 #「プロパティ」と「メソッド」の表記に関するポリシーも何処にあるのか私には理解出来ません。 | ||||||||
|
投稿日時: 2004-02-20 17:32
VB.NETの設計者がプロパティを理解していない、・・・ん?「VBの設計者」?「VB.NETの設計者」ではなく? オブジェクト指向言語に生まれ変わらせるより、過去との互換性を優先した、それが『大切なものをわかっていない』ということなら、VBに関しては、ちょっと疑問の余地があると思います。むしろ、VB.NETではなく、全く新しい言語としてしまったほうが良かった…そのためにC#があるはずですが、それが期待したほどVBの遺産を駆逐できなかった。C#が思ったほどVB放逐に成果を上げなかったため、C#よりもVBに近く、けれどもC#への移行を促すものとしてのVB.NETと考えると、大切なものは「遺産相続」ではないでしょうか。 #私は現バージョンのVB.NETは「中継」であると思っています | ||||||||
|
投稿日時: 2004-02-20 18:15
や、多分「VBの設計者」というのは、VBでコードを書くための設計者という意味で、「VB言語」自体の設計者という意味ではないと思われます… --追記-- って書いたんですけどちょっとぼけてた気がします。なんかほかの事と混乱してました… [ メッセージ編集済み 編集者: なちゃ 編集日時 2004-02-20 18:17 ] | ||||||||
|
投稿日時: 2004-02-21 12:06
「VB」と「VB.NET」の設計者両方を含めてました。 少し、分かり難かったですね。 済みません。 ええ、Jittaさんが オブジェクト指向言語に生まれ変わらせるより、過去との互換性を優先した、それが『大切なものをわかっていない』 と書いておられる様に、そういう意味です。 今の「VB.NET」を見てる限り、分かり易くが前面に出過ぎて、必要以上に複雑にし、結局歪めてる気がします。 これでは、「VB.NET」ユーザーは「VB.NET」以外の例えば「C#」等を利用しなければ、オブジェクト指向、「FCL」を理解出来ないという事になります。 「VB.NET」とっては、一番不幸な事だと思います。 #特に、「MustInherit」「MustOverride」等、言葉自体を置き換えないと他の言語の概念と一致しないのは最悪だと思います。 #何故、こんなキーワードを新たに「.NET」の世界に新たに持ち込んだのでしょうか? 兎に角、現在の「VB.NET」がそうなっている以上これは将来に亘ってそう簡単に変更出来ないでしょう。 従って、私はブギウギさんに、「C#」で基本の概念を補足する事お薦めします。 |