東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

車輪の再発明

やりますよ。ええ、やっちゃいます。

ModelとViewの分離のためにModelからViewにイベント飛ばすわけです。
Model側に用意したeventに View側のdelegateをアタッチするのね。
ModelとViewのライフタイムが一致してれば問題ないんだけど、
たとえばViewがダイアログだったりするとModelより先にViewが
お亡くなりになります。

このとき、Viewがこの世を去るにあたってdelegateをちゃんと
デタッチしておかないと、ModelがViewを掴んだままになるます。
ダイアログは消えてるのにイベントに反応しちゃうです。
声はすれども姿は見えず、ほんにおまえは屁のような。と。

デタッチせずにお構いなしにこの世を去らせたく、
弱参照をアタッチできんもんかとこねくりまわしてました。

それが車輪の再発明。WeakEventManagerゆーもんがあったです。
おかげさまでそれまでの丸一日をふっ飛ばしてくれやがりました。
まぁ無理もない話で、そもそもWeakEventManagerてぇ代物は
WPF絡みのものだったもんだから、僕が釣り糸垂れてた川には
棲んでなかったのよねー orz

車輪の再発明はがっかりさんしょんぼりさんではありますが、
芸の肥しになんだから善しとしましょう。

そんなこんなで WeakEventManager を使って Windows.Forms で
こさえたViewを弱参照させるココロミちうなう。

<そこで質問>
System.Type hoge があり、
このhogeが示すクラスが
Foo あるいは Foo の派生であるか
を調べにゃならんのです。
If hoge.Equals(GetType(Foo)) Then
だと Foo であるか否かはわかるけど、Foo の派生かはわかんない。
If hoge.IsSubclassOf(GetType(Foo)) Then
だと Foo の派生であるかはわかるけど、Foo であるかはわかんない。
If hoge.Equals(GetType(Foo)) OrElse hoge.IsSubclassOf(GetType(Foo)) Then
すりゃいいんだけどかったるいので、
これをイッパツで判断できんもんでしょか。
</そこで質問>

投稿日時 : 2009年4月13日 1:42

コメントを追加

# re: 車輪の再発明 2009/04/13 1:53 えムナウ

>If hoge.Equals(GetType(Foo)) OrElse hoge.IsSubclassOf(GetType(Foo)) Then
別のケースですが私もそうやっております。

# re: 車輪の再発明 2009/04/13 2:04 επιστημη

そなの?
なんかテがないもんかなー、長ったらしくて気に入らんのだが。

# re: 車輪の再発明 2009/04/13 10:02 菊池

実物 or 派生だと IsAssignableFrom に含まれてますね、インターフェースまで含めて判定してくれるので、私は殆ど IsAssignableFrom で判定してます。


http://msdn.microsoft.com/ja-jp/library/system.type.isassignablefrom(VS.80).aspx

# [VB(.NET)] クラスのチェック 2009/04/13 10:24 雑記 - otherwise

車輪の再発明 (東方算程譚) 「そこで質問」に反応。 本質的な回答ではないけど、 If 文のタイプ数を減らす目的であれば、拡張メソッドを使う方法がありますね。 <Extension()> _ Public Function IsClassOf(ByRef type1 As Type, ByVal type2 As Type) As Boolean

# re: 車輪の再発明 2009/04/13 11:16 επιστημη

> IsAssignableFrom
ソレダ! なるほど"代入可能か"ですか。

> 拡張メソッド
ぁぃ、コッチ方面に逃げようかと考えてました (^^;;;

# re: 車輪の再発明 2009/04/13 12:22 aetos

IsAssignableFrom と IsSubclassOf では方向が逆なので注意ですな。
IsSubclassOf は「派生形 is subclass of 基底型」ですが、IsAssignableFrom は「基底型 is assignable from 派生形」です。

# re: 車輪の再発明 2009/04/13 15:24 επιστημη

> 方向が逆
うんうん。

If hoge.Equals(GetType(Foo)) OrElse hoge.IsSubclassOf(GetType(Foo)) Then
と(インタフェースを含んで)上位互換なのが
If GetType(Foo).IsAssignableFrom(hoge) Then
となりますか。

タイトル  
名前  
URL
コメント