空类而不是枚举 - 可怕的想法?

时间:2011-05-20 21:35:18

标签: c# class enums

我目前正在使用枚举来描述许多可能的操作系统平台。我有东西WIN32,SOLARIS64,LINUX32,但也有更广泛的类别,如ALLWIN和ALLUNIX。我在我的代码中有一个位置,我需要决定给定的平台是否属于另一个平台。对我而言,这听起来像继承,但显然枚举不能相互继承。

然后我想到将这些平台从1个枚举转换为彼此继承的空类。我觉得这在概念和空间上是一个可怕的想法,但不是C#的主人我以为我会在这里发帖寻找更有经验的意见。有什么想法吗?

这看起来像是:

public class ALL {};

  public class ALLWIN : ALL {};

    public class WINNT : ALLWIN{};

      public class WIN32 : WINNT{};

... 依此类推。

3 个答案:

答案 0 :(得分:6)

枚举不能继承,但它们具有标志的概念,它完成了你想要做的同样的事情:

[FlagsAttribute]
enum OSs
{
   WinNT = 1;
   WinNXP = 2;
   AllWIN = WinNT | WinNXP;
}

依旧......

链接到enumerations

答案 1 :(得分:4)

您希望坚持使用枚举。您可以通过位掩码进行检查。有点像:

[FlagsAttribute]
enum Systems {
    WinNT = 1,
    Win32 = 2,
    Linux32 = 4,
    Solaris = 8,
    AllWin = WinNT | Win32, // do a bitwise OR of each of the Windows systems
    AllUnix = Linux32 | Solaris // same thing here for Unix systems
}

当您检查平台是否属于特定系统时,您将按照以下代码执行按位AND:

if (platform & Systems.AllWin > 0) { 
  // this is a Windows system 
}

这有意义吗?

答案 2 :(得分:1)

设计系统的关键部分之一是能够定义您的域。这通常也是最难的部分。我建议,退后一步。你需要定义什么?一个操作系统?操作系统有什么作用? 继承是一种强大的工具,但这种情况似乎适用于“有一种”关系,而不是一种“是一种”关系。而不是让它们继承,也许定义一个具有属性的对象。 Concider this:

    public enum OperatingSystemFamily
    {
        Microsoft,
        linux,
        Mac
    }

    public class OperatingSystem
    {
        public string Name { get { return "WINNT"; } }
        public OperatingSystemFamily Family { get { return OperatingSystemFamily.Microsoft; } }
    }

这可能与你想要完成的事情完全不同。 你觉得怎么样?

如前所述,使用枚举标志可以作为一个很好的轻量级解决方案。唯一的问题是,您永远不会有超过64种操作系统和类别组合。