Стартирането на метод като реакция на определено съобщение трябва да се извършва в съответствие с природата на обекта-получател на съобщението, независимо от това, че този метод може многократно да е предефиниран в йерархията на наследяване
Свързване на съобщения и методи:
Механизмът, който служи за определяне на това – кой метод трябва да бъде изпълнен в отговор на дадено съобщение
Реализация на механизма на свързване на съобщения и методи
- Статичен и динамичен тип на променливите в ЕООП:
- статичен тип на променлива – типът, който е приписан на променливата при нейното деклариране
- динамичен тип на променлива – типът, на който в действителност принадлежи променливата
- Статичният тип на обектовите променливи може да е различен от техния динамичен тип
- Проблем: Трябва ли свързването между съобщение и метод да се основава на статичния тип на променливата (екземпляра – получател на съобщението) или трябва да се има пред вид нейният динамичен тип?
- Видове ООЕП:
- Езици с динамични типове (Смолток, Objective-C)
- Езици със статични типове (Object Pascal, C++)
Механизъм на “ранно свързване”. Статичнo свързвани методи
- Механизъм на “ранно свързване” (МРС) – early binding
Механизъм на свързване, при който по време на компилиране на програмата се определя коя версия на даден метод (евентуално предефиниран в йерархията на наследяване) ще бъде изпълнена при получаване на съответното съобщение се нарича “ранно свързване” (статично свързване)
- Статично свързвани методи:
Методи, за които свързването се осъществява по МРС
- Правило на МРС:
Когато към екземпляр на даден клас се изпрати съобщение (или редица от съобщения), то при свързването на съобщението с подходящ метод, определянето на класа, на който принадлежи получателят на съобщението става на базата на неговия статичен тип, т. е. счита се, че това е текущият клас (защото само неговият тип е известен по време на компилация). Ако този клас включва реализация на съответния метод, то методът се изпълнява, а ако не – търсенето продължава нагоре по йерархията на предшествениците. Или накратко, търсенето при свързване започва винаги от текущия клас и нагоре
Свързване на съобщения и методи в MS Visual C++. Особени видове членове на класа. Статично свързвани и виртуални методи – предназначение, деклариране, ограничения. Примери.
Свързване на съобщения и методи в С++
С++ е език със статичен тип на променливите. При декларирането на метода, програмистът трябва (чрез специална клауза) да определи кой от двата механизма ще се използва при свързването на този метод
Особени видове членове на класа
- Особенни видове член-променливи
- Статични (static) член-променливи – ако член-променлива на един клас се декларира като static, всички екземпляри на този клас използват едно и също копие на този член:
class Count {
public:
static int numbInst;
//…
};
- при създаване на обект от такъв клас, за статичната член-променлива не се отделя памет
- заделянето на памет става едва при явно дефиниране на тази член-променлива:
int Count::numbInst;
void main() {
Count co1, co2;
co1.numbInst=1; co2.numbInst=12;
{
достъп до статичните член-променливи при описание на методите на класа е както при обикновените полета
достъп до статичните член-променливи може да се осъществи чрез известните начини за достъп до членове (“.” или “->”) на екземпляр на класа или чрез оператора за област на действие за самия клас (!!! при private статичните член-променливи е допустим само последният начин)
Count::numbInst=100;
- Константни (const) член-променливи – стойностите на const член-променливите се инициализират само чрез инициализиращия списък в конструктора на класа и не могат да се променят по-късно:
class constMV {
public:
constMV():j(2) {i=1;}; //иниц. на const поле
int i;
const int j;};
- Особенни видове член-функции
- Статични (static) член-функции – декларират се подобно на static член-променливи
– достъп до статичните член-функции чрез екземпляр на класа може да се осъществи чрез оператора за област на действие за самия клас
– на тях не се предава указател this
– конструкторите не могат да са статични
- Константни (const) член-функции –връщат константен резултат, който може да се използва като всяка друга константна променлива
class constMF {
public:
const int constFunc() {return 3};};
- Непостоянни (volatile) член-функции – връщат volatile резултат, който може да се използва като всеки друг volatile елемент. Компилаторът не оптимизира кода на функцията, защото няма гаранция, че елементът не се променя между две последователни инструкции.
- Член-функции с константен указател this:
class Coefficient {
public:
Coefficient(double initValue){ myValue = initValue;}
double GetValue(void) const {return myValue; }
//…
double myValue;};
- всяка член-функция декларирана с ключовата дума const след списъка с параметри може да се активира за const обект
- всяка член-функция декларирана без ключовата дума const след списъка с параметри не може да се активира за const обект
- такива член-функции могат да активират само други член-функции на същия обект декларирани по същия начин и нямат право да променят стойностите на член-променливите на класа освен тези, които са декларирани mutable
- Член-функции с volatile указател this – забранява някои оптимизации за компилатора, защото в рамките на функцията член-променливите на обекта се считат за volatile
Виртуални методи:
- Деклариране:
virtual <заглавие на член-функция>;
- Описание – спазват се изучените правила за описание на методи, но при описание на функцията извън класа, в заглавието на описанието се пропуска клаузата virtual
- Пример:
class Vehicle {
public:
Vehicle(char* regnum): myRegNum(strdup(regnum)) {}
~Vehicle(void) { delete[] myRegNum; }
virtual void Describe(void)
{cout<<”Unknown vehicle, registr. “<<myRegNum<<endl;}
char* myRegNum;
};
class Car : public Vehicle {
public:
Car(char* make, char* regnum)
: Vehicle(regnum), myMake( strdup(make) ) {}
~Car(void) { delete[] myMake; }
virtual void Describe(void)
{cout<<”Car(“<<myMake<<”),registr. “<<myRegNum<<endl;}
char* myMake;
};
- Правила:
- при предефинирането на виртуален метод в класовете-наследници заглавието му трябва изцяло да съвпада със заглавието от декларацията в предшественика (тип на метода, списък с формални параметри)
- при предефинирането на виртуален метод в класовете-наследници клаузата virtual от заглавието му може да се пропусне (тя се подразбира):
class Car : public Vehicle {
public:
Car(char* make, char* regnum)
: Vehicle(regnum), myMake( strdup(make) ) {}
~Car(void) { delete[] myMake; }
void Describe(void) //virtual е пропуснато
{cout<<”Car(“<<myMake<<”),registr. “<<myRegNum<<endl;}
char* myMake;
};
- виртуалните функции не могат да се декларират като статични
- деструкторът на класа може да бъде виртуален
- конструкторите не могат да са виртуални. Те могат от своя страна да извикват виртуални методи, но това не води до желания резултат в случай че това е конструктор на предшественик (з-то наследникът не е напълно инициализиран)
Активиране:
- Методите-конструктори играят ключова роля за осъществяване на МКС (за поддържане на допълнителна информация за обектите по време на изпълнение на програмата)
- достъпът до виртуална функция се определя от секцията, в която тя е декларирана в класа на екземпляра, чрез който е активирана – в резултат от МКС е възможно обект да активира версията на виртуален метод, който е деклариран като private в своя клас
- използването на оператора за задаване на област на действие при активиране на член-функция, отменя МКС при свързването й (виж следващия пример за рационално и смесено число – метода TMixed::Reduce)
Пример: Коригиране на грешките в програмата за преобразуване на рационално и смесено число в правилна форма – т.е. методите Reduce и Print да се декларират като виртуални (за класове TRational и TМixed)
class TRational {
public:
//… разликата е само в методите Reduce и Print
virtual void Reduce ();
virtual void Print ();
void Reduce_Print ();
};
class TMixed : public TRational {
public:
//…
virtual void Reduce (); //може и без virtual
virtual void Print (); //може и без virtual };
Сходни статии:
- Динамика на съществуването в обектно ориентираното програмиране В обектно ориентираното програмиране тази страна на динамиката, която може да се нарече динамика на съществуването, е реализирана чрез механизмите за създаване и инициализация на екземпляри на обекти В обектно...
- Интелигентна система за демонстриране методи за търсене в пространствено състояниe Графа може да се опише чрез отношението ”nasl”. Съседството между два възела X и Y може да се изрази чрез предиката: nasl(X,Y). който е в сила,ако Y е непосредствен...
- Дек в програмния език C Съществува още една, по-рядко използвана, разновидност на списък, която се явява обобщение на стек и опашка едновременно – това е дек (DEQue, съкращение от английското Double Ended Queue – опашка...
- Свързване на системи за автоматизирано конструиране с други автоматизирани системи и програми Между конструирането, проектирането на технологични процеси и изработването на обекта съществуват непрекъснати информационни връзки. Крайният резултат от автоматизираното конструиране е конструктивната документация- монтажни и детайлни чертежи, спецификации, изчислителни записки и...
- Финансови анализи, методи и направления В пазарни условия финансовият анализ представлява съществен елемент от финансовото управление на всяко едно предприятие. Решаването на редица въпроси, свързани с интересите на собствениците на капитала, потенциалните инвеститори, кредиторите, финансовите...
