はじめに
こんにちは、東京アプリケーションシステム 第二ソリューション部のK.Tです。
「列挙型をクラスに置き換えてみる」ということで、今回は、列挙型とクラスについての内容となります。
列挙型
列挙型について簡単に説明すると、列挙型は、名前と整数値を持つ型です。
主にマジックナンバーを避ける為の定数値の定義として使用されます。
C#では、下記のように宣言できます。
1 2 3 4 5 |
public enum Status { Enabled = 1, Disabled, } |
クラスで実装
列挙型と同様の実装をクラスで行いたいと思います。
列挙型は、名前と整数値を持つので、NameとNumのプロパティを持つ基底クラスを作成します。
1 2 3 4 5 6 7 |
public abstract class Enumeration { public int Num { get; } public string Name { get; } public Enumeration(int num, string name) => (Num, Name) = (num, name); } |
基底クラスを継承した、Statusというクラスを定義し、さらにStatusを継承したEnabledTypeとDisabledTypeを実装します。
1 2 3 4 |
public abstract partial class Status : Enumeration { public Status(int num, string name) : base(num, name) {} } |
1 2 3 4 5 6 7 8 9 |
public abstract partial class Status { public static readonly Status Enabled = new EnabledType(); private class EnabledType : Status { public EnabledType() : base(1, "Enabled") {} } } |
1 2 3 4 5 6 7 8 9 |
public abstract partial class Status { public static readonly Status Disabled = new DisabledType(); private class DisabledType : Status { public DisabledType() : base(2, "Disabled") {} } } |
これで、列挙型と似た実装をすることができました。
もちろん、列挙型には、他に便利な関数が用意されているので、同様の実装とは程遠い状態です。
C#では、列挙型に実装を書けない為、クラスで実装したほうが便利な場合があります。
まとめ
今回は、列挙型を簡易的にクラスに置き換えてみました、特に利点等について説明しませんでしたが、
Open Closedの原則に違反しないコーディングを行うためには、列挙型ではなく、クラスを使用した場合が良い場合もあります。