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

Изтрито е съдържание Добавено е съдържание
Hiksa (беседа | приноси)
{{Типове данни}}, форматиране: 11x А|А, 4x интервали, А|АБ (ползвайки Advisor.js)
Ред 22:
 
=== Наследственост ===
Въпреки че клас-ориентираните езици са често приемани, че поддържат наследяване, то не е присъща част от концепцията за класове. Някой езици, често сочени като [[обектно-ориентирани езици|„обектно-ориентирани езици“]], поддържат класове, но не поддържат наследяване. Примери за обектно-ориентирани езици включват по-ранните версии на [[Visual Basic|Visual Basic]].
 
=== Асоцииране ===
В [[обектно-ориентирания анализ|обектно-ориентирания анализ]] и в [[UML|UML]](Унифициран Език за Моделиране), асоциация между два класа представлява сътрудничество между класовете или техните инстанции. Асоциациите имат посока; например, бинарно-ориентираната асоциация между два класа означава, че двата класа са наясно с връзката си. Асоциациите могат да бъдат обозначени в зависимост от тяхното име или цел.
 
Асоциативна роля е даден край на асоциация и описва ролята на съответния клас. Например ролята на „абонат“ описва начина, по който инстанциите от класа „Човек“, участват в „абониран за“ връзка с класа „Списание“. Също така, „Списание“ има „списания с абонамент“ роля със същата връзка. Множеството от асоциативни връзки описва колко инстанции взаимодействат с всяка инстанция от друг клас от асоциацията. Често срещаните множества са „0..1“, „1..1“, „1..*“ и „0..*“ където „*“ означава какъвто и да е брой на инстанциите.
Ред 34:
 
=== Абстрактни и конкретни ===
В език, който поддържа нследяването, <b>абстрактен клас</b> или абстрактен основен клас, е клас който не може да бъде наследен, защото е или осначен като абстрактен или просто използва [[абстрактни методи|абстрактни методи]] (виртуални методи). Абстрактните класове задават виртуални класове посредством [[сигнатура|сигнатурата]]та, която ще се имплементира от директните или индиректните наследници на абстрактния клас. Преди наследяването на клас от абстрактен такъв, всички абстрактни методи на класовете реодители трябва да бъдат имплементирани от някакъв друг клас във веригата на наследяване.
 
Повечето обектно ориентирани езици за програмиране позволяват на програмистите да уточняват кои класове се смятат за абстрактни и няма да позволят на такива да бъдат инстанцирани. Например в [[Java|Java]] и [[PHP|PHP]], ключовата дума abstract (абстрактен) се използва. В [[C++|C++]], абстрактен клас е такъв имащ поне един абстрактен метод зададен чрез съответния синтаксис в езика (чиста виртуална функция в C++ езика).
 
Клас състоящ се само от виртуални методи се нарича Чисто Абстрактен Основен Клас (Pure ABC) в C++ и също е известен като [[интерфейс (програмиране)|интерфейс]] от потребителите на езика. Други езици, особено Java и C#, поддържат вариант на абстрактни класове, наричани interface (интерфейс) чрез ключовата дума в езика. В тези езици [[множественото наследяване|множественото наследяване]] не е разрешено, но класа може да имплементира много интерфейси. Такъв клас може само да съдържа публично достъпни методи.
 
Конкретния клас (concrete class) е такъв, който може да се [[инстанциране|инстанцира]], противоположно на абстрактните класове, които не могат.
Ред 53:
<b>Метакласовете</b> са класове чиито инстанции са класове. Метакласовете описват обща структура на колекция от класове и могат да имплементират [[Шаблони за дизайн (софтуер)|дизайн модел]] (design pattern) или да опишат определени видове класове. Метакласовете са често използвани за описване на [[Софтуерна рамка|фреймуърци]] (frameworks).
 
При някои езици, като [[Python|Python]], [[Ruby|Ruby]] или [[Smalltalk|Smalltalk]], класа е също и обект; поради тази причина всеки клас е инстанция на уникален метаклас, който е вграден в езика. Например в [[Objective-C|Objective-C]], всеки обект и клас са инстанция на NSObject. Например така наречената Common Lisp Object система (CLOS) осигурява метаобектови протоколи ([[Metaobject|metaobject protocols]] – MOPs) за да имплементира тези класове и метакласове.
 
=== Ненаследими ===
''Ненаследимите'' класове (класове без подкласове) позволяват на програмистите да създават класове и архитектури от класове, които след дадено ниво да не могат да се разклоняват повече.(''Самостоятелните'' класове също може да се третират като ненаследими, защото не позволяват да се създават йерархични структури с тях). За сравнение ''абстрактните'' класове предполагат, насърчават и дори изискват разклоняване (създаване на подкласове), за да се използват въобще. ''Ненаследимите'' класове обаче са изрично фиксирани.
 
''Ненаследим'' клас се декларира с sealed в C# или final в Java.
Пример: В Java класът String е дефиниран като final.
 
''Ненаследимите'' класове позволяват на компилатора (в езиците ползващи компилатор) да направи оптимизации, които не са достъпни за наследимите класове.
Ред 71:
* Позволява да се отделя интерфейса на класа от работния му код
* Лесна навигация в големи класове с помощта на редактор
* Позволява разделяне на модули, подобно на аспектно-ориентираното програмиране, но без употребата на допълнителни инструменти
* Позволява няколко специалиста да работят едновременно по един клас без нуждата от последващо обединяване на техния код в един файл.
 
Ред 77:
 
=== Неинстантни ===
''Неинстантните'' класове позволяват на програмистите да групират полета и методи, които да са достъпни по време на изпълнение без нуждата да се създават инстанции на тези класове. Всъщност създаването на инстанции от тези класове е изцяло забранено.
Пример: в ''C#'', клас обозначен със ''"static"'', не може да се инстанциира, може да съдържа само статични членове (полета, методи, други), няма конструктор и е ''фиксиран/запечатън''.
 
Ред 89:
 
В допълнение класовете може да се асоциират или наследяват взаимно, което опростява модела на взаимосвързаност. Така по-лесно може да се проследи йерархията на обектите, връзките между тях и модела им на взаимодействие. Също така се намалява нужния код – ако например два класа споделят еднакви атрибути, но единия има допълнителни атрибути (описва частен случай), то може единия клас да се дефинира като подклас на другия и съвместните им атрибути да се запишат само веднъж. Като цяло добре изградена рамка от класове улеснява навигацията, разбирането и работата с компютърни програми.
 
== Представяне при изпълнение ==
 
{{Превод от|en|Class (computer programming)|568635094}}
 
{{Типове данни}}
[[Категория:Програмни конструкции]]
[[Категория:Обектно-ориентирано програмиране]]