列挙型の継承とかTypeSafeEnumとか
やりたいこと
#define WM_CLOSE 0xnnn #define WM_QUIT 0xnnnn #define WM_USER 0xnnnn // hoge.h #include <windows.h> #define WM_HOGE (WM_USER+1)
みたいことをC#でやろうと思うと
enum Message { Close, Quit } enum MyMessage : Message { Hoge }
できません。
この例で言うとメッセージの送り手と受け手は当然WM_HOGE/MyMessage.Hogeを知っている必要がありますが、それを知らないSendMessageだのGetMessageだのも気にせずスルーパスしてくれます。
拡張部分の知らないメソッドに渡したらどうなってしまうんでしょう?
http://bbs.wankuma.com/index.cgi?mode=al2&namber=9118&KLOG=21#5
どうにもならないようにしておいて、必要ならオーバーライドさせればいいかと。
でもdefault:のことを考えると破壊的変更・・・無理ですね。
継承せずに拡張部分を分けたら?
Message型をスルーパスするメソッドに渡せません。
キャストは可能ですが内部値が被って破綻します。int云々。
WM_...みたいに値固定すれば被らないよ?
やだめんどくさい。
列挙型って内部値気にしないことが多いけど確かに定数のグルーピング他に使われてるしむしろ値一つで列挙ってどういう・・・
そんなあなたにJavaの列挙型を
継承できないじゃん!
でもフィールド付けられるのは素敵。
そんなあなたはTypeSafeEnumを実装しなさい
というところが今できることかなと。動的にはなってしまうけれど、そこはほら、埋め込みテーブルなんかもそれぞれ折り合い付けてるみたいですし。
値の追加には触れてませんが、実装例もいくつかあるようです。
[C#] 何故 enum に拘りたくなるのか? | Moonmile Solutions Blog
C#でタイプセーフEnumパターン - ぐるぐる~
C#でTypeSafeEnumを書いてみた - Bug Catharsis
この辺読んでタイプセーフと聞いてもピンと来ませんでしたが、改めて考えると相手のことを知らずに定義されても衝突しないってのは大事でした。
今書いてるコードはどうしようかなあ。