Пустые классы вместо перечислений - ужасная идея? - PullRequest
2 голосов
/ 21 мая 2011

В настоящее время я использую перечисление для описания ряда возможных платформ операционной системы.У меня есть вещи WIN32, SOLARIS64, LINUX32, но также и более широкие категории, такие как ALLWIN и ALLUNIX.В моем коде есть место, где мне нужно решить, попадает ли данная платформа в категорию другой.Для меня это звучало как наследование, но, очевидно, перечисления не могут наследовать друг от друга.

У меня тогда возникла мысль превратить эти Платформы из 1 перечисления в пустые классы, которые наследуются друг от друга.Я чувствую, что это ужасная идея концептуально и пространственно, но я не являюсь мастером C #, я подумал, что выложу здесь, чтобы найти более опытные мненияКакие-нибудь мысли?

Это будет выглядеть примерно так:

public class ALL {};

  public class ALLWIN : ALL {};

    public class WINNT : ALLWIN{};

      public class WIN32 : WINNT{};

... И так далее, и так далее.

Ответы [ 3 ]

6 голосов
/ 21 мая 2011

Перечисления не могут наследоваться, но у них есть концепция флагов, которая выполняет то же самое, что вы пытаетесь сделать:

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

и так далее ...

Ссылка на перечисления .

4 голосов
/ 21 мая 2011

Вы хотите придерживаться перечислений для этого.Вы можете сделать проверку с помощью битовой маски.Что-то вроде:

[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 
}

Имеет ли это смысл?

1 голос
/ 21 мая 2011

Одной из ключевых частей проектирования системы является возможность определения вашего домена.Это часто самая сложная часть.Я бы предложил, сделав шаг назад.Что вам нужно определить?Операционная система?Что есть в операционной системе?Наследование является мощным инструментом, но этот сценарий, похоже, поддается отношениям «имеет», а не «есть».Вместо того, чтобы наследовать их, возможно, определяя объект, который имеет свойство.Обдумайте это:

    public enum OperatingSystemFamily
    {
        Microsoft,
        linux,
        Mac
    }

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

Это может быть совершенно не так, как вы пытаетесь достичь.Как вы думаете?

Как уже упоминалось в другом месте, использование флагов enum может работать как хорошее облегченное решение.Единственная загвоздка в том, что вы не можете иметь более 64 комбинаций операционных систем и категорий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...