2011-05-20 30 views
2

我目前使用枚举来描述一些可能的操作系统平台。我有WIN32,SOLARIS64,LINUX32的东西,但也有更广泛的类别,如ALLWIN和ALLUNIX。我在我的代码中有一席之地,我需要决定给定的平台是否属于另一个平台的类别。对我来说,这听起来像继承,但显然枚举不能相互继承。空类而不是枚举 - 可怕的想法?

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

这看起来是这样的:

public class ALL {}; 

    public class ALLWIN : ALL {}; 

    public class WINNT : ALLWIN{}; 

     public class WIN32 : WINNT{}; 

... 等等等等。

+2

至少,他们不应该是ALLCAPS – SLaks 2011-05-20 21:38:40

回答

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 
} 

而且当你检查,看看是否该平台是一个特定的系统中,您将在下面的代码做一个位与为做到这一点:

if (platform & Systems.AllWin > 0) { 
    // this is a Windows system 
} 
沿着线的东西

这有道理吗?

+0

非常有意义 - 感谢您解释并给出后期使用的示例。我知道有比创建15个继承类更好的方法! – pghprogrammer4 2011-05-20 22:00:02

6

枚举不能继承,但他们有标志其完成你正在试图做同样的事情的概念:

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

等等...

链接enumerations

+0

没错。一定要在'enum'之前放置'[FlagsAttribute]'。 – 2011-05-20 21:39:05

+0

@jim谢谢!在我的打字过程中忘记了这一点。 – kemiller2002 2011-05-20 21:41:06

+0

感谢您的回答!我会把它给'cs',因为他的回答有一些信息(加上他似乎有点新,可能会使用点)。谢谢你! – pghprogrammer4 2011-05-20 21:58:10

1

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

public enum OperatingSystemFamily 
    { 
     Microsoft, 
     linux, 
     Mac 
    } 

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

这可能是从你正在试图完成什么完全关闭基地。 你觉得呢?

正如其他地方提到的使用枚举标志可以作为一个不错的轻量级解决方案。唯一的问题是你永远不能拥有超过64种操作系统和类别的组合。