一位开发人员最近开始在通常适合枚举的地方使用类模式而不是枚举。相反,他使用类似于下面的内容:
internal class Suit
{
public static readonly Suit Hearts = new Suit();
public static readonly Suit Diamonds = new Suit();
public static readonly Suit Spades = new Suit();
public static readonly Suit Clubs = new Suit();
public static readonly Suit Joker = new Suit();
private static Suit()
{
}
public static bool IsMatch(Suit lhs, Suit rhs)
{
return lhs.Equals(rhs) || (lhs.Equals(Joker) || rhs.Equals(Joker));
}
}
他的理由是,它无形中看起来像一个枚举,但允许他将与枚举相关的方法(如上面的 IsMatch)包含在枚举本身中。
他称其为枚举类,但这不是我以前见过的东西。我想知道优点和缺点是什么以及在哪里可以找到更多信息?
Thanks
编辑:他描述的另一个优点是能够为枚举添加特定的 ToString() 实现。
枚举在很多情况下都很好,但在其他情况下却很差。通常我会发现一些问题
与枚举:
- 与枚举相关的行为分散在应用程序中
- 新的枚举值需要霰弹枪手术
- 枚举不遵循开闭原则
由于枚举行为分散,我们永远无法将其返回到源类型,因为枚举类型不能有任何行为(或与此相关的状态)。
另一方面,枚举类:
每个枚举类型的所有变体不仅可以下推到枚举类,还可以下推到每个特定的子类型。
枚举在各种场景中都能很好地工作,但在域模型中可能会很快崩溃。枚举类提供了大部分相同的可用性,并具有成为行为目的地的额外好处。
Switch 语句不再是必要的,因为我可以将可变性和知识推回到模型内部。如果由于某种原因我需要检查特定的枚举类值,该选项仍然对我开放。这种模式不应该取代所有枚举,但有一个替代方案是很好的。
可以阅读here http://lostechies.com/jimmybogard/2008/08/12/enumeration-classes/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)