Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Классы перечисления
Перечисление - это частный случай класса, класс, заданный без собственных методов. Перечисление задает конечное множество возможных значений, которые могут получать объекты класса перечисление. Поскольку у перечислений нет собственных методов, то синтаксис объявления этого класса упрощается, остается обычный заголовок и тело класса, содержащее список возможных значений. Вот формальное определение синтаксиса перечислений: [атрибуты][модификаторы]enum имя_перечисления[: базовый класс]{список_возможных_значений}Идентификаторы, заданные в перечислении, как правило, имеют содержательный смысл и являются именами сущностей предметной области. Они используются для организации интерфейса пользователя, при вводе и выводе, при описании действий над объектами перечисления. В памяти компьютера элементы перечисления представлены числами, так что перечисление является числовым типом данных, а не символьным, как могло бы казаться. Множество элементов перечисления проецируется на целочисленный тип данных. По умолчанию элементы перечисления проецируются на начальный отрезок типа int. В этом случае при описании перечисления из n идентификаторов первый из идентификаторов отображается в число 0, последний - в число n-1. Значения, заданные списком, проецируются на плотное подмножество базового класса. Процессом отображения перечисления на числовой тип данных можно управлять. Базовый класс, который задан при описании перечисления, указывает, в какой тип отображается перечисление. Понятно, что в качестве базового класса можно указывать только классы, задающие целочисленный тип. Кроме типа char, любой целочисленный тип может выступать в роли базового класса. При желании можно задать не только базовый класс, но и интервал представления внутри базового класса. Если для первого идентификатора в списке указать целочисленное значение, то оно будет использоваться как указание задания левой границы интервала представления. Все остальные значения будут проецироваться на интервал с заданной левой границей. Более того, множество целых, на которое проецируется список элементов перечисления, вовсе не обязано быть плотным. Числовое значение, на которое будет проецироваться данный идентификатор, можно задать для каждого идентификатора. Эта крайне важная и полезная особенность перечислений, активно используемая программистами при работе со шкалами.
Примеры объявлений классов-перечислений: public enum Profession{teacher, engineer, businessman}; public enum MyColors {red, blue, yellow, black, white}; public enum TwoColors {black, white}; public enum Rainbow {красный, оранжевый, желтый, зеленый, голубой, синий, фиолетовый}; public enum Sex: byte {man=1, woman}; public enum Days: long {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
Вот несколько моментов, на которые следует обратить внимание при объявлении перечислений.
Пример Печать дня недели.
Данный пример иллюстрирует следующие особенности работы с объектами перечислений.
Битовые маски (Шкалы) Предположим, что проектируется некоторый содержательный класс, задающий описание множества объектов, например, класс Car, описывающий автомобили, или класс Employee, представляющий описание служащих некоторой фирмы. Для объектов этого класса зададим набор из n бинарных свойств. Бинарность свойства означает, что свойство может принимать только два значения. Служащий может владеть или не владеть иностранными языками, автомобиль может быть легковым или не быть таковым. В таких ситуациях набор таких свойств удобно представить перечислением, заданным в виде шкалы, а в соответствующий содержательный класс следует включить поле, тип которого задан этим перечислением. Теперь формальное определение. Перечисление, содержащее n элементов, будем называть шкалой, если отображение задано для каждого элемента перечисления и элемент с индексом k отображается в число 2k. Каждый объект перечисления, заданного шкалой, представляется целым числом в диапазоне [0, 2n-1]. Это число следует рассматривать как число в двоичной системе счисления - набор из n битов (разрядов), каждый из которых описывает соответствующее свойство объекта. Единица в разряде указывает, что объект обладает данным свойством; ноль означает отсутствие свойства. class User { bool CanDelete; bool CanRead; bool CanWrite; bool CanModify; bool CanCreate; } [Flags]enum PermissionTypes: int { None = 0, Read = 1, Write = 2, Modify = 4, Delete = 8 Create = 16, All = Read | Write | Modify | Delete | Create} //and the class from before class User { PermissionTypes Permissions = PermissionTypes.None; }
|