Пустые классы вместо перечислений — ужасная идея?

#c# #class #enums

#c# #класс #перечисления

Вопрос:

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

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

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

 public class ALL {};

  public class ALLWIN : ALL {};

    public class WINNT : ALLWIN{};

      public class WIN32 : WINNT{};
  


И так далее, и тому подобное.

Комментарии:

1. По крайней мере, они не должны быть ALLCAPS

Ответ №1:

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

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

и так далее…

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

Комментарии:

1. Верно. Не забудьте поставить [FlagsAttribute] перед enum .

2. @jim Спасибо! Забыл об этом в своем потоке ввода.

3. Спасибо за ответ! Я собираюсь передать это ‘cs’, потому что в его ответе было немного больше информации (плюс он, похоже, немного новее и, вероятно, мог бы использовать точки). Хотя спасибо!

Ответ №2:

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

 [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 amp; Systems.AllWin > 0) { 
  // this is a Windows system 
}
  

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

Комментарии:

1. это имело смысл — спасибо за объяснение и приведение примера последующего использования. Я знал, что есть более приятный способ, чем создание 15 классов, которые наследуются!

Ответ №3:

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

     public enum OperatingSystemFamily
    {
        Microsoft,
        linux,
        Mac
    }

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

Это может полностью отличаться от того, чего вы пытаетесь достичь.
Что вы думаете?

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