Oop класове. Обектно-ориентирано програмиране

Условия "обект" и "клас" познати на всички хора. За компютърните специалисти обаче те имат свои собствени конотации. Това са основните понятия в обектно-ориентираното програмиране. Класовете са тип данни, дефинирани от разработчика, които се характеризират с начина на предаване и съхранение, профила на използване и набора от действия, които могат да се извършват върху тях. Те се отличават с това, че могат да бъдат реализирани като интерфейс.

Какво е ООП (обектно-ориентирано програмиране)

Опитните разработчици са запознати с езиците COBOL и C. Програмите, написани в тях, представляват поредица от инструкции стъпка по стъпка. Те използват процедури и функции, за да направят програмата модулна. Тази парадигма се фокусира върху логиката, а не върху данните и методите за тяхното комбиниране.

Класове по обектно-ориентирано програмиране

Съвременните езици за програмиране Delphi, Java, C# и други следват обектно-ориентирания подход. В това значение на данните, а не просто написване на инструкции за изпълнение на дадена задача. Обектът е вещта или идеята, която искате да моделирате. Това може да бъде всичко, например служител, банкова сметка, автомобил, различни мебели и т.н.

Концепцията за обектно-ориентирано програмиране (ООП) е неразривно свързана със следните критерии:

  • Абстракция.
  • Капсулиране.
  • Наследяване.
  • Полиморфизъм.

Нека разгледаме по-подробно всяка от тях.

Абстракция

Този критерий ви позволява да се съсредоточите върху действията на самия обект, но не и върху начините, по които тези действия са реализирани в програмирането. ООП предполага, че абстракцията е да се знаят възможно най-много данни за даден обект. Той помага за създаването на независими модули, които могат да взаимодействат помежду си по няколко начина.

Опитваме се да се фокусираме избирателно само върху нещата, които са важни за нас (в живота) или за нашия модул (в програмирането). Модифицирането на един независим модул не се отразява на останалите. Единственото нещо е трябва да знаем, - е това, което ни дава. Лицето, което го използва, не трябва да се притеснява как се обработва задачата, какво се случва във фонов режим.

Конструкторът на клас C

Предметите от ежедневието, които използваме, имат абстракции, прилагани на различни нива. Един пример за обектно-ориентирано програмиране е прилагането на спирачки в автомобил. Тази система е абстрактна: всичко, което водачът трябва да направи, е да натисне педала, за да накара автомобила да намали скоростта и да спре. Промените в системата за ускоряване не засягат спирачната система, тъй като те са независими. Водачът не трябва да разбира вътрешната работа на спирачките. Необходимо е само да натиснете педала навреме. Спирачките (както дисковите, така и барабанните) работят и автомобилът намалява скоростта си.

Капсулиране

Това понятие е тясно свързано с абстракцията. Капсулирането е разкриване на информация решаване на проблеми, Не изисква от потребителя да разбира напълно предмета на продукта. Тя свързва данните и поведението и не позволява на клиента или потребителя на модула да узнае вътрешното представяне, в което е реализирано абстрактното поведение.

Обектно-ориентираната система за програмиране

Данните не са пряко достъпни. Достъпът до тях се осъществява чрез специфични функции. Скриването на вътрешните елементи на даден обект защитава неговата цялост, като не позволява на потребителите да приведат вътрешните данни на компонента в невалидно или несъвместимо състояние.

Наследяване

Това е механизъм за повторна употреба на код, който може да помогне за намаляване на дублирането на кода. Тази концепция е мощна характеристика на обектно-ориентираните езици за програмиране. Той помага за организиране на класовете в йерархия, като им позволява да наследяват атрибути и поведение от компоненти нагоре по веригата.

Пример за наследяване: папагалът е птица, руската рубла е вид валута. Въпреки това фразата "банката е банкова сметка" не е вярно. Тази връзка е очевидна, когато дадена единица трябва да бъде описана в дадена среда. С помощта на наследяване можете да дефинирате обща реализация на ООП и нейното поведение, а след това за специализираните класове можете да ги предефинирате или промените в нещо по-специфично. Наследяването не работи в обратна посока. Източникът (наричан още родител) няма да има свойствата на производния (дъщерен) клас.

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

Полиморфизъм

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

Например, ако искате да напишете съобщение на лист хартия, можете да използвате писалка, молив, маркер или стилус. Достатъчно е инструментът да се побира в ръката ви и да може да оставя следи, когато влезе в контакт с хартията. Оказва се, че някои действия на човека се записват на лист хартия, а какъв инструмент се използва, не е толкова важно за предаването на информация.

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

Прилагане на ООП

Наследяването е един от начините за постигане на полиморфизъм, при който поведението, дефинирано в наследен клас, може да бъде заменено чрез написване на потребителска реализация на даден метод. Това се нарича презапис (полиморфизъм по време на компилация).

Съществува и друга форма на полиморфизъм, наречена претоварване, при което наследството не се взема предвид. Името на метода е същото, но аргументите в него са различни.

Особености на понятията "клас" и "обект"

За да започнем работа с обектно-ориентираното програмиране, трябва да разберем какво представляват класът и обектът на ООП. Важно е да се разбере разликата между двете. Класът е план за създаване на обект. Той определя атрибутите и поведението на. Това е като инженерен чертеж на къща. Обектът е инстанция на класа. Това е разликата между тях. Примерът по-долу показва как се декларира клас "TForml" и променлива "Forml" на език за програмиране Делфи:

typeTForml =клас(TForm)Бутони: TButton;процедура ButtonlClick(Подател: TObject);край;varForml : TForml;

Ако искаме да моделираме, например, автомобил в нашата програма, трябва да го определи атрибути: модел, гориво, марка, цвят, поведението му, както и т.нар. методи: стартиране на двигателя, спиране, ускоряване и т.н. Добре се вижда, че горните данни не са специфични само за една марка или модел превозни средства.

При обектно-ориентирания подход се опитваме да обобщим нашия обект (машина), като заявяваме, че този, който ще моделираме в нашата програма, ще има определен брой атрибути и методи. Възможно е да има и други показатели и характеристики на превозното средство, но изброените по-горе са достатъчни, за да разберем как работи класът в ООП.

Когато използваме тези данни, създаваме превозно средство с определени параметри. Като програмираме един и същ обект (автомобил), можем да вземем различни характеристики, както е показано в таблицата по-долу:

Обект 1Тема 2
модел: VAZ 2107Модел: VAZ 2109
гориво: бензингориво: дизелово гориво
Цвят: червенцвят: зелен
метод на стартиране: Start ()метод за стартиране на двигателя: Start ()
метод на спиране: Break ()метод на забавяне: Break ()
метод на ускоряване: Acceleration ()метод на ускоряване: Acceleration ()

По този начин обектно-ориентираното програмиране ви позволява лесно да моделирате поведението на сложна система в реалния свят. При ООП данните и функциите (атрибути и методи) се комбинират в обект. Това предотвратява нуждата от общи или глобални данни при ООП. Това е основната разлика между обектно-ориентирания и процедурния подход.

Какво е клас в ООП?

Класовете на ООП се състоят от елементи от различни типове:

  1. Полета с данни: съхранява състоянието на класа с помощта на променливи и структури.
  2. Методи: подпрограми за манипулиране на определени данни.
  3. Някои езици позволяват трети тип - свойства. Това е нещо средно между първите две.

Методи

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

Съществуват много методи. Поддръжката им зависи от езика. Някои от тях се създават и извикват от кода на програмиста, а други (специални, като конструктори, деструктори и оператори за трансформация) се създават и извикват от генерирания от компилатора код. Езикът може да позволи на програмиста да дефинира тези специални методи.

Интерфейс

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

Един обект може да има няколко роли и потребителите могат да го използват от различни гледни точки. Например обект от тип "лице" могат да имат роли:

  • войник (с поведение) "стреляйте по врага").
  • (с поведения "обичайте жена си").
  • Данъкоплатец (с поведение "да плащате данъци") и т.н.

Но всеки обект изпълнява поведението си по различен начин: Миша плаща данъците си навреме, Андрей - със закъснение, а Петър изобщо не ги плаща. Същото може да се каже и за всеки обект и други роли.

Какво е ООП

Възниква въпросът защо базовият клас на всички обекти не е интерфейс. Причината за това е, че в такъв случай всеки клас ще трябва да имплементира малка, но много важна група методи, което ще отнеме ненужно много време. Оказва се, че не всички класове се нуждаят от специфична имплементация - в повечето случаи е достатъчна обща имплементация по подразбиране. Не е необходимо да се надписват методите, но ако ситуацията го изисква, е възможно да се имплементират.

Добър пример са бутоните на предния панел на телевизора. Може да се каже, че те са интерфейсът между потребителя и окабеляването от другата страна на корпуса. Човек натиска бутона за включване, за да включи и изключи даден уред. В този пример конкретният телевизор е инстанция, всеки метод е представен с бутон, а заедно те съставляват интерфейса. В своята най-често срещаните форма е спецификация на група свързани методи без тяхната реализация.

Конструктор

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

Следващият пример обяснява концепцията за конструктор на клас в C++ (общ език за програмиране):

#включваизползване наПространство от имена стандартно;класЛиния{публичен:voidsetLength(двоен len );двоенgetLength(void);Линия();// Съобщение за дизайнчастен:двоен дължина;};// Дефиниране на функции, включително конструкторЛиния::Линия(void){cout <<"Обектът е създаден"<< endl;}void Линия::setLength(двоен len ){дължина = len;}двоен Линия::getLength(void){връщане на дължина;}//Тело на програматаintосновен(){Линия линия;// дължина на низлиния.setLength(6.0);cout <<"Дължина на линията : "<< линия.getLength()<<endl;връщане на0;}

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

Създаден обект

Дължина на линията: 6

Деструктор

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

Синтаксисът на деструктора е същият като този на конструктора, но името на класа се използва с тилда "~" като префикс.

Следващият пример на C++ обяснява концепцията за деструктора:

#включваизползване наПространство от имена стандартно;класЛиния{публичен:voidsetLength(двоен len );двоенgetLength(void);Линия();// декларация на конструктора~Линия();// декларация за деструкторчастен:двоен дължина;}// дефиниция на функция, включително конструкторЛиния::Линия(void){cout <<"Обектът е създаден"<< endl;}Линия::~Линия(void){cout <<"Изтрит обект"<< endl;}void Линия::setLength(двоен len ){дължина = len;}двоен Линия::getLength(void){връщане на дължина;}//Тело на програматаintосновен(){Линия линия;// дължина на низлиния.setLength(6.0);cout <<"Дължина на линията : "<< линия.getLength()<<endl;връщане на0;}

Когато горният код бъде компилиран и изпълнен, той ще даде следния резултат:

Обектът е създаден

Дължина на линията: 6

Обектът е изтрит

Какви са предимствата на класовете

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

  • Бързо развитие.
  • Лесна поддръжка.
  • Повторно използване на кода и дизайна.
Основни концепции за обектно-ориентирано програмиране

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

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

Статии по темата