我目前正在使用枚举来描述许多可能的操作系统平台。我有东西WIN32,SOLARIS64,LINUX32,但也有更广泛的类别,如ALLWIN和ALLUNIX。我在我的代码中有一个位置,我需要决定给定的平台是否属于另一个平台。对我而言,这听起来像继承,但显然枚举不能相互继承。
然后我想到将这些平台从1个枚举转换为彼此继承的空类。我觉得这在概念和空间上是一个可怕的想法,但不是C#的主人我以为我会在这里发帖寻找更有经验的意见。有什么想法吗?
这看起来像是:
public class ALL {};
public class ALLWIN : ALL {};
public class WINNT : ALLWIN{};
public class WIN32 : WINNT{};
... 依此类推。
答案 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种操作系统和类别组合。