Наследяване в развитието на класа

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

E

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

Наличието на механизма за наследяване в езика за програмиране ви позволява да не дефинирате повторно вече описаните параметри и свойства на обектите в класа, производният клас просто ги "наследява".

ПримерНаследяване (клас Window_changing_color). Въз основа на класа Window ще изградим дъщерен клас, който може да променя цвета на прозореца на екрана. За да направите това, достатъчно е да добавите метода "Промяна на цвета" към родителския клас:

Клас Window_changing_color - родител: клас Window:

Класът "Window_changing_color" съдържа всички полета на родителския клас и всички негови методи. Освен това, обекти от тип "Window_changing_color" могат да променят цвета на прозореца към посочения в съобщението "Change_color" (фиг.).

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

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

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

Полиморфизъм в развитието на класа

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

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

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

Има няколко термина, свързани със специфични механизми за прилагане на полиморфизъм за различни случаи:

чист полиморфизъм- използва се за указване, че един функционален код може да бъде интерпретиран по различен начин в зависимост от типа на аргументите; използванив абстракционни езици на високо ниво, като LISP или SMALLTALK;

предефиниране(прост полиморфизъм) - използва се в ООП, когато има различни дефиниции на методи в йерархията на класовете, специфичен метод се определя от типа обект при компилиране на програмата -ранно свързване, методите се наричатстатични полиморфни;

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

генерични функции или шаблони- се използват в ООП, когато се изпълняват на езика на параметризирани класове (например в C ++), параметрите на такъв клас са типовете аргументи на метода на класа (обсъдени по-долу).

Прост полиморфизъм(клас Window_with_text). Нека е необходимо да се разработи на базата на класа "Прозорец" класа "Прозорец_с_текст". За целта към полетата на класа "Window" трябва да се добавят специални полета за определяне на координатите на първата буква от текста - Xt, Yt и поле, съдържащо самия текст - Text. Освен това ще ви е необходим специален метод, който ще се справи със съобщението "Нарисувай". Въпреки това вече имаме родителски метод „Показване“, който обработва това съобщение. Следователно трябва да замените родителския метод с дъщерния метод. Механизмът на полиморфизма позволява на наследствения клас "Window_with_text" да предостави свой собствен метод "Display" (фиг.).

развитието

Методът "Initialize" също трябва да бъде заменен, тъй като той трябва да инициализира допълнителни полета на класа.

Клас Window_with_text - родител: class Window:

полета Xt, Yt,Текст

Метод за инициализиране (aXl,aYl,aX2,aY2,aColor,aXt, aYt, aText)

Забележка. Когато внедрявате методите Display и Initialize върху дете, можете да извикате подходящите родителски методи и след това да добавите оператори, които дефинират собствените действия на метода за класа, който разработвате.

Комплексен полиморфизъм или създаване на полиморфни обекти.

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

при предаване на обект от тип дъщерен клас като действителен параметър към подпрограма, в която този параметър е деклариран като тип параметър на родителския клас (явно - в списъка с параметри или неявно - като вътрешен параметър, използван при извикване на методи - self или this);

Типът на полиморфен обект става известен само по време на изпълнение на програмата.Съответно, когато се извиква полиморфен метод за такъв обект, необходимият аспект също трябва да бъде определен по време на изпълнение. За да направите това, езикът трябвада реализира механизъм за късно свързване, който ви позволява да определите типа на обекта и съответно аспекта на полиморфния метод, който се извиква в програмата на етапа на нейното изпълнение.

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

C

наследяване
фалшив полиморфизъм. Нека родителският клас съдържа два метода "Out" и "Print", единият от които извиква другия. Дъщерният клас наследява метода "Out", но има свой собствен метод "Print". Методът "Out" е наследен и може да бъде извикан както на обектродителски клас, а за обект на дъщерен клас (фиг.).

Когато извиквате метода "Out" на обект от клас наследник, трябва да се уверите, че този метод извиква метода Print на наследника, а не на родителя (фиг.).

Възможно е да се определи за обект от кой клас: родител или дъщерен методът „Out“ се извиква само по време на изпълнение. Следователно методът "Печат" трябва да бъде обвързан късно.

клас

Методите, за които трябва да се приложи късно свързване, сенаричат ​​виртуални. За да ги опишем в езиците за програмиране, разгледани по-долу, се използва служебната дума "виртуален".

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

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

В такива случаи трябва изрично да предефинирате типа на обекта, като използвате използвания език.