ここで何らかの点を見逃している可能性があります。その場合は、その議論を私の質問の一部として含めてください :)。
これは、作業コードの短縮および名前変更されたサンプルです。 はGetTicks(…)
単一のサンプルであり、あらゆる種類の機能である可能性があります ( の値は> 0 < 9
特定の Enum a.so を返す必要があります)。
public static class Something
{
public enum TypeOf : short
{
Minute = 2, Hour = 3, Day = 4, …
}
public static long GetTicks(Something.TypeOf someEnum)
{
long ticks = 0;
switch (someEnum)
{
case Something.TypeOf.Minute:
ticks = TimeSpan.TicksPerMinute;
break;
case Something.TypeOf.Hour:
ticks = TimeSpan.TicksPerHour;
break;
....
}
return ticks;
}
}
// This class is called from anywhere in the system.
public static void SomeMethod(string dodo, object o, Something.TypeOf period)
{
// With the design above
long ticks = Something.GetTicks(period);
// Traditional, if there was a simple enum
if (period == Something.Day)
ticks = TimeSpan.FromDays(1).Ticks;
else if (period == Something.Hour)
ticks = TimeSpan.FromHours(1).Ticks;
}
アイデアは、 に関係する機能enum
を にできるだけ近いところに集めることですenum
。 はenum
理由となる機能です。また、 の近くでそのような機能を探すのは簡単で自然だと思いますenum
。また、 は変更や拡張も簡単です。
欠点は、 のenum
ように、 をより明示的に記述する必要があることです。デザインが非標準に見えるかもしれません。また、 がクラス内で内部使用するためのものであるSomething.TypeOf
場合、それは適用されますか。enum
abstract
これをもっとうまく行うにはどうすればよいでしょうか? 、基本継承、 を試しましたpartial
。どれも当てはまらないようです。
ベストアンサー1
もう少し書くことを気にしないのであれば、拡張メソッドを作成して のインターフェースを拡張することができますenum
。
例えば
public enum TimeUnit
{
Second,
Minute,
Hour,
Day,
Year,
/* etc */
}
public static class TimeUnitExtensions
{
public static long InTicks(this TimeUnit myUnit)
{
switch(myUnit)
{
case TimeUnit.Second:
return TimeSpan.TicksPerSecond;
case TimeUnit.Minute:
return TimeSpan.TicksPerMinute;
/* etc */
}
}
}
これにより、列挙型に「インスタンス」メソッドを追加できます。ただし、一般的に好まれるものより少し冗長になります。
enum
ただし、は主に名前付きの値として扱う必要があることに注意してください。