2011-05-20 31 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種操作系統和類別的組合。