Ооп, обекти, класове. Наследяване и интерфейси

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

Обектен подход

В парадигмата на обектно-ориентираната разработка има три основни инструмента, които разработчиците използват, за да пишат добър код:

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

Наследяване

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

Концепцията за наследяване

За да разберем концепцията за наследяване, можем да вземем пример от живота. Съществува абстрактно понятие за "човек". Всеки човек има общи характеристики, които могат да се използват за описанието му. като ръст, тегло, цвят на косата, тембър на гласа и т.н. Иван Иван, ученик от 1 "А" клас, е конкретен представител на понятието "човек", т.е., използвайки езика на обектно-ориентирания подход, Иван Иван е наследник на "човека". Или, например, котката на съседа Барсик наследява понятието за котка. може да се проектира по-сложно наследяване: Barsik се наследява от Maine Coon, която на свой ред се наследява от Cat.

Как това се описва от езика за програмиране?

В процес на разработка софтуер процесът на наследяване позволява да се създаде клас на базата на други. Родителският клас се нарича базов клас, а другите производни класове се наричат. Наследяването се състои в това, че методите, свойствата и полетата на родителя се предават на потомците. Синтаксис на наследяване класове по езика на програмирането на C# може да изглежда така. Например:

клас Ivan : Person{// клас body{

Пример за механизъм за унаследяване на класове:

class Person{public int Age { get; set; }}class Ivan : Person{public void Talk(){/ Иван говори}}class Peter : Person{public void Walk(){/ Петър ходи}}class Program{static void Main(string[] args){Ivan ivan = new Ivan();ivan.Възраст = 29; // обозначава възрасттаPeter = new Peter();peter.Възраст = 35ivan.разговор();peter.Разходка();}}

Въз основа на базовия клас Person се създават класове за наследяване и свойството Age е достъпно и за двата класа.

Конструктор на базовия клас

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

Ако е дефиниран само в наследен клас, конструкторът по подразбиране (родителски) се извиква, когато се създава обект от наследен клас, и след това се извиква неговият наследник.

Ако са зададени конструктори и в родителския, и в подчинения клас, ключовата дума base се използва за извикване на. При деклариране на такава структура на наследяване се използва следният синтаксис за задаване на конструктор:

public Иван (int age) : base (age){/конструктор на тялото}

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

Достъп до полета от подчинен клас

Наследяването на достъпа до свойствата и методите на базовия клас от клас наследник е възможно, ако всички те са декларирани със следните ключови думи:

1. Публичен.

Дава неограничен достъп до членовете на класа: от Main, от производни класове, от други аналози.

2. Защитени.

Членът може да бъде достъпен само от изходния клас или неговите производни аналози.

3. Вътрешен.

Ограничението на даден член е локализирано само от асемблито на този проект.

4. Защитени вътрешни.

Ограничението към члена е ограничено само до това асембли на проекта или от производни класове.

Модификатори за достъп

Наследяването на достъпа до членовете на класа зависи от ключовите думи. Ако не е посочен като такъв при декларирането на член, достъпността е зададена по подразбиране (private).

Множествено унаследяване

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

Примери за интерфейси

Тези структури се създават извън класовете, декларирани с ключовата дума интерфейс:

интерфейс IMyInterfave{void MyMethod (int someVar);}

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

За да укажете, че даден клас ще имплементира даден интерфейс, трябва да посочите името на конструкцията след декларацията на класа, точно както правите при нормалното наследяване:

клас MyClass : IMyInterface{public void MyMethod (int someVar)}

Интерфейси са необходими, за да, за прилагане на множествено наследяване. В език за програмиране C++, но е възможно наследяване на класове; в C# за тази цел се използват интерфейси. Класът може да имплементира няколко интерфейса, като в този случай те се изброяват със запетая след декларацията на класа:

клас MyClass : IMyFirstInterface, IMySecondInterface{//class body}

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

Двоичен код

Малко повече за наследяването на класовете

Java, C#, C++ - всички обектно-ориентирани езици прилагат механизма на наследяване по свой собствен начин. Но смисълът е един и същ навсякъде: да се предадат свойствата на родителя на обекта на детето. Интерфейсите и абстрактните класове са удобни инструменти за изпълнение на тази задача.

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