Изброен тип

от Уикипедия, свободната енциклопедия

Изброеният тип (на английски: enumeration / enum - изброяване, списък) е конструкция, наподобяваща клас, в която обаче можем да декларираме само логически свързани константи.

Изброените типове могат да приемат стойности само измежду изброените в типа константи. Променлива от изброен тип може да има за стойност някоя измежду изброените в типа стойности (константи), но не може да има стойност null.

Изборен тип (enumeration / enum), като понятие в компютърната наука[редактиране | редактиране на кода]

Изборен тип на колекция от елементи представлява подреден списък с всички елементи от тази колекция. Този тип колекции навлиза в информатиката от комбинаториката и по-точно изброителната комбинаторика, която се занимава с изброяването на начините по които дадена структура може да бъде подредена. Класически примери за това е пресмятането на пермутации и вариации. В статистиката се нарича още статистическа съвкупност, това е съвкупност от голям брои случаи.

В повечето съвременни езици(обектно ориентирани) за програмиране се използва изборен тип, който се представя в паметта на компютъра, като подреден списък от константи. Ползването на константи вместо просто променливи, има положителен ефект върху чистотата и прилежността на програмния код, което е една от основните причини за въвеждането на изборен тип в информатиката. Използване на изброен тип се среща в програмни езици като C#, Java и други.

Изборен тип в C#[редактиране | редактиране на кода]

Изброените типове в C# се декларират с помощта на запазената дума enum и се състоят от множество именувани константи. Наследяват типа System. Enum. Вътрешно се представят с int, но може да се зададе и друг числов тип. Силно типизирани са – превръщат се в int експлицитно.

Декларация на enum в C#[редактиране | редактиране на кода]

В общия случай:

[<modifiers>] enum <enum_name>
{
 constant1[=value1] [, constant2[=value2]] [, ...]
}

Обяснение на параметрите:

  • <modifiers> – незадължителен параметър, който определя нивото на достъп до параметрите в дадена конструкция. Примери за modifier са public, private, protected, internal.
  • <enum_name> – име на блока. Задължително поле, което се използва всеки път, когато искаме да използваме някоя от константите, декларирани в тялото на нашия блок. Важно при избора на име е спазването на правилата за имена на класове в C# (за повече информация C# Help).
  • costant – самите константи. Те са задължителна част от декларацията на нашия блок. Отделят се една от друга със запетая и са от тип – името на нашия блок(enum_name).
  • value – опционален параметър в случаите, в които искаме да декларираме числова константа. Приемат се за константи само цели числа.

Пример за декларация на константи с дните от седмицата:

enum Days
{
 Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}

В този случай константите в блока са от тип Days!

Всяка константа в един изброен тип представлява текстово представяне на някакво цяло число. По подразбиране, това число е индексът на константата в списъка от константи на изброения тип. Тази числова стойност може да бъде променена като по време на декларацията присвоим стойността, която предпочитаме, на всяка една от константите:

enum CarsManufactureDates
{
 PorscheCarrera = 2001, MercedesBenzCLS = 2006, AlfaRomeoSpiderJTS = 2009
}

Извикване на константи от блок enum[редактиране | редактиране на кода]

Примера за извикване на константи, използвайки блока дефиниран по-горе:

//Декларираме клас с помощта на който ще извикаме enum блока CarsManufactureDates.
public class CarShop
{
 public CarsManufactureDates date;

 public CarShop(CarsManufactureDates date)
 {
 this.date = date;
 }

 public CarsManufactureDates Date
 {
 get { return date; }
 }
}

static void Main()
{
 //Създаваме два нови класа от туп CarShop.
 CarShop myCar = new CarShop(CarsManufactureDates.PorscheCarrera);
 CarShop mySecondCar = new CarShop(CarsManufactureDates.AlfaRomeoSpiderJTS);

 //Ако не конвертираме към int ще получим името на нашата константа вместо стойността(value).
 Console.WriteLine("My first car is manufactured in {0}. ", (int)myCar.Date);
 Console.WriteLine("My second cars name is {0}. ", mySecondCar.Date);
}

При компилиране на горния код получаваме следния резултат:

My first car is manufactured in 2001.
My second cars name is PorscheCarrera.

Изброен тип с битови флагове[редактиране | редактиране на кода]

Изброеният тип може да се използва за дефиниране на битови флагове, които позволяват променлива от изброен тип да съдържа комбинация от стойностите, които са дефинирани в изпроения списък. Изброеният тип с битови флагове се създава чрез използването на атрибута System. FlagsAttribute и задаване на подходящи стойности на константите, така че върху тях да могат да се приложат побитови операции като AND, OR, NOT and XOR.

В примера по-долу е дефиниран изброен тип Days2. Типът има Flags атрибут и на всяка константа е присвоена следващата по-висока степен на двойката:

[Flags]
enum Days2
{
 None = 0, //0x0
 Sunday = 1, //0x1
 Monday = 2, //0x2
 Tuesday = 4, //0x4
 Wednesday = 8, //0x8
 Thursday = 16, //0x10
 Friday = 32, //0x20
 Saturday = 64 //0x40
}
class MyClass
{
 Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}

За сетване на флаг на enum се използва побитовата операция OR:

// Инициализиране с два флага
meetingDays = Days2.Tuesday | Days2.Thursday;

// Сетване на допълнителен флаг
meetingDays = meetingDays | Days2.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);
Meeting days are Tuesday, Thursday, Friday

Изтриване на флаг се извършва чрез побитовата операция XOR:

meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
Meeting days are Thursday, Friday

Проверка за това дали даден флаг е сетнат се прави с побитовата операция AND:

bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
Thursday is a meeting day.

Изброен тип в Java[редактиране | редактиране на кода]

Изброеният тип може да се дефинира, както и в езика C#, по следния начин:

public enum Currency {USD, EUR, BGN, GBP};

Инстанция на изброен тип се създава, когато някоя от константите се извика за първи път в кода.

На константите могат да бъдат присвоени стойности по време на създаване:

public enum Currency {USD(1), EUR(5), BGN(10), GBP(25)};

За да работи това присвояване, е нужно да се дефинира член-променлива и конструктор, тъй като, например BGN(10), вика конскруктор, който приема int стойност:

public enum Currency {
	USD(1), EUR(5), BGN(10), GBP(25);
 private int value;
	private Currency(int value){
	this.value = value;
 }
};

Конструкторите трябва да са с модификатор за достъп private. За достъпване на стойностите, асоциирани с всяка константа, може да се дефинира публичен метод getValue() в самия изброен тип, подобно на дефиниране на метод в клас:

public enum Currency {
	USD(1), EUR(5), BGN(10), GBP(25);
 private int value;
	private Currency(int value){
	this.value = value;
 }
 public int getValue(){
 return code;
 }
};

За разлика от C# в езика Java, изброеният тип може да има конструктор, инстансни полета и методи.

Изброен тип в C/C++[редактиране | редактиране на кода]

Декларацията на изброения тип в C и C++ става по подобен на предходните начин (опростена схема):

enum [идентификатор] [клас|структура] {елементи};

Идентификаторът е името на изброения тип. Класът и структурата са незадължителни спецификатори, а елементите са поредицата от елементи за дадения изборен тип.

enum Months{ January, February, April, May, June,
 June, July, August, September,
 October, November, December};

Всяка стойност от изброения тип става енумератор, т.е. има своя стойност, съответстваща на нейната позиция. По подразбиране стойностите започват от 0, но може да бъде зададена и ръчно, като всяка следваща се увеличава с единица:

enum Months{ January = 1, February, March April, May, June,
 June, July, August, September,
 October, November, December};

Така February ще е със стойност 2, March ще е с 3 и т.н.

Всяка стойност от изброения тип се третира като константа и трябва да бъде уникална за него.

Има малка разлика в декларирането в C и C++. В C ключовата дума enum е задължителна, докато в C++ тя може да бъде пропусната

Източници[редактиране | редактиране на кода]