#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 комбинаций операционных систем и категорий.