|
■No9121 (未記入 さん) に返信 > enumはSystem.Enumからの派生クラスであり、System.EnumはSystem.ValueTypeからの派生クラスです。 > System.ValueTypeからの派生クラスは値型のクラス(構造体)なので.NETの多くからは継承できないはずです。 > どうしても継承したい場合は普通のクラスに定数フィールドを並べて継承するしかなさそうですね。
なるほど。C#でenumの継承が使えないことはわかりました。
■No9124 (Hongliang さん) に返信 > 例がどうにも。 > [Flags] enum MusicFormats { None = 0, Wav = 1, Mp3 = 2, Aac = 4, Atrac = 8, Wma = 16, ... } > MusicFormats appleSupported = MusicFormats.Wav | MusicFormats.Mp3 | MusicFormats.Aac; > とすべき状況ですからねぇ。 > // 64bits でも足りないとなるとやっぱり列挙体風のクラスを作ることになりますけど。
いやいや、待ってください。 ビットのフラグで値を割り振るのは「重複可能な属性」の場合ではないですか? #例えばFileAttributesみたいな。 これが、SupportedFormatという属性を表すならその通りなんですが、 ここでは純粋にフォーマット形式を表す値として例に挙げたつもりでした。 例えば、ConvertなりExportなりといったメソッドがあってその引数に使うような。
■No9125 (魔界の仮面弁士 さん) に返信 > ■No9118 (ぼのぼの さん) に返信 >>enumの場合似たような記述方法はあるのでしょうか? > 無いと思いますが、それができないと困るような状況に陥っているのでしょうか?
あ、いや、別にそういうわけではないです(^^; ただの興味です。
ただ、そういう状況を無理くり考えてみると。
例えば、何らかの情報を保持するクラスがあって、 public enum FileFormat {XML, Binary}; virtual void Export(string fileName, FileFormat format) と定義されてたとします。
で、A,B,Cという派生クラスがあって、 CクラスだけCSV形式でのエクスポートにも対応したくなった、という場合。
まぁCsvExportという別メソッドを作っちゃえばいいわけなんですが、 FileFormatを継承して「CSV」だけ追加したenumを作って使えたら、 ちょっと便利かな?などと思いまして。
つまりですね、知りたかったのは、 「『出力形式』みたいなものを表すクラスなり列挙体なり」に「継承」という概念を持ち込むことが、 オブジェクト指向型言語での設計における一般的な指針に反するのか、 それとも単に「C#ではenumの継承は無理よ」という言語仕様上の制約の結果に過ぎないのか。
上記例のような設計が、少なくともC#でenumを使っては無理、てことで、 じゃあ代わりにclassを使って同様のことを実現するのは、 設計としては間違っていない?それとも普通はやらない?ということなのでした。
|