Изброен тип

от Уикипедия, свободната енциклопедия
Направо към: навигация, търсене

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

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

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

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

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

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

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

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

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

[<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[редактиране | edit source]

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

//Декларираме клас с помощта на който ще извикаме 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.


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

Изброеният тип може да се използва за дефиниране на битови флагове, които позволяват променлива от изброен тип да съдържа комбинация от стойностите, които са дефинирани в изпроения списък. Изброеният тип с битови флагове се създава чрез използването на атрибута 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[редактиране | edit source]

Изброеният тип може да се дефинира, както и в езика 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++[редактиране | edit source]

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

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

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

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++ тя може да бъде пропусната

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