Клас (програмиране): Разлика между версии

Изтрито е съдържание Добавено е съдържание
Редакция без резюме
Ред 1:
'''Класът''' е една от характеристиките на [[обектно-ориентирано програмиране|обектно-ориентираното програмиране]]. Това е съвкупност от [[променлива (програмиране)|променливи]] и [[функция (програмиране)|функции]], които са обвързани в логическа структура и работят заедно. Класът служи като модел за представяне на реални обекти и софтуерни обекти, описвайки атрибути (свойства) и методи (поведение) на обектите.
 
[[Категория:Програмни конструкции]]
[[Категория:Обектно-ориентирано програмиране]]
 
== Дизайн и приложение ==
 
=== Структура ===
=== Поведение ===
=== Концепцията за интерфейс на клас ===
=== Достъпи ===
 
== Взаимовръзки между класовете ==
Като допълнение към дизайна на самостоятелните класове, езиците за програмиране могат да поддържат по-сложен дизайн въз основа на връзки между класовете. Най-често срещаните типове междукласови връзки са композиционни и йерархични.
Line 19 ⟶ 14:
=== Йерархична ===
Класове могат да произлизат от един или повече вече съществуващи класове, формирайки по този начин йерархична взаимовръзка между първоизточниците (базови класове, бащини класове или супер-класове) и произлизащите класове (наследствени класове, суб-класове). Взаимовръзката между наследственият клас и базовият клас е широко известна, като „е“ връзка. Например, клас „Бутон“ може да произлиза от клас „Контрола“. Следователно, всеки Бутон е Контрола. Структурните и поведенчески членове на бащиният клас се онаследяват от наследственият клас. Наследствените класове могат да имат в себе си дефинирани допълнителни структурни членове (полета данни) и/или поведенчески членове (методи), в допълнение към наследените такива. Също така в някои езици за програмиране е позволено, суб-класовете да отменят и/или предефинират наследени методи.
 
Не всички езици позволяват множествено наследяване. Например Java позволява даден клас да имплементира множество интерфейси, но да наследява от само един клас. В случай, че множественото наследяване е позволено, йерархията е тип насочен ацикличен граф (или НАГ за по-кратко), в противен случай е тип дърво. В йерархията класовете играят ролята на възли, а унаследяванията – на връзки. Нивата на тази йерархия се наричат слоеве или слоеве на абстракция (нива на абстракция).
 
Line 30 ⟶ 26:
 
== Видове класове ==
 
Има много различни категории класове; все пак тези категории не са задължително разделени класове в отделни дялове.
 
=== Абстрактни и конкретни ===
В език, който поддържа възможност за наследяване, <b>абстрактен клас</b> или абстрактен основен клас, е този който не може да бъде инстанциран, защото е означен като абстрактен и заради това имплементира [[абстрактни методи]] (или виртуални методи). Абстрактните класове предоставят имплементация на някои методи, абстрактните се оставят неимплементирани, както и виртуалните. Те от своя страна задължително се имплементират от директните или индиректните наследници на абстрактния клас.
 
Повечето обектно ориентирани езици за програмиране позволяват на програмистите да уточняват кои класове се смятат за абстрактни и няма да позволят на такива да бъдат инстанцирани. Например в [[Java]] и [[PHP]], ключовата дума abstract (абстрактен) се използва. В [[C++|C++]], абстрактен клас е такъв имащ поне един абстрактен метод зададен чрез съответния синтаксис в езика (чиста виртуална функция в C++ езика).
Line 58 ⟶ 53:
 
''Ненаследим'' клас се декларира с sealed в C# или final в Java.
 
Пример: В Java класът String е дефиниран като final.
 
''Ненаследимите'' класове позволяват на компилатора (в езиците ползващи компилатор) да направи оптимизации, които не са достъпни за наследимите класове.
 
=== Частични ===
Line 77 ⟶ 73:
=== Неинстантни ===
''Неинстантните'' класове позволяват на програмистите да групират полета и методи, които да са достъпни по време на изпълнение без нуждата да се създават инстанции на тези класове. Всъщност създаването на инстанции от тези класове е изцяло забранено.
 
Пример: в ''C#'', клас обозначен със ''"static"„static“'', не може да се инстанциира, може да съдържа само статични членове (полета, методи, други), няма конструктор и е ''фиксиран/запечатън''.
 
=== Безименни / анонимни ===
Line 83 ⟶ 80:
 
== Ползи ==
Компютърните програми обикновено представят модел на реалния свят или някакъв абстрактен свят (например ''домейн''). Понеже всеки клас моделира отделна концепция, употребата на класове позволява по естествен начин да се моделира заобикалящият ни свят. Всеки клас в модела може да се разглежда като съществително, методите на този клас - – като глаголи, които се отнасят до тези съществителни. Например една бизнес система може да се моделира с помощта на класове като „Клиент“, „Продукт“, „Служител“, „Фактура“, „Работа“ и т.н. Класът „Фактура“ може да има методи като „Създай“, „Отпечатай“ или „Изпрати“. Класът „Работа“ може да се „извърши“ (метод) или „отмени“ (друг метод). Ако програмата може да моделира и опише реалността акуратно, то тя може да предостави на потребителите ценна информация за тази система и нейните обекти. Класовете позволяват ясни връзки между модела и реалността, което прави лесно създаването, поддържането, промяната и разбирането на модела. Класовете също така позволяват повече контрол върху сложността на подобни модели (опростяване, прегледност).
 
Класовете ускоряват разработката на програми, като намаляват повторението на идентичен код, улесняват тестовете и отстраняването на грешки. Ако един клас е щателно тестван и е доказано чист от грешки (бъгове), то употребата му ще подобри качеството на крайния код за разлика от употребата на прясно написан код или код сглобен по copy/paste модела. Освен това ефективното преизползване на класове означава, че ако е допусната грешка, то ще трябва да се редактира само един клас, а не няколко различни сегмента от кода.