Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМКД_ОБП_Урдабаева.doc
Скачиваний:
113
Добавлен:
01.03.2016
Размер:
1.29 Mб
Скачать

Объектілер иерархиясы.

Кластардың иерархиясы мұрагерлік принципінің иерархиясы болып табылады, яғни «бұл оның бір түрі». Мысалы, «жұмысшы жұмысшылардың бірі», «автокөлік» «транспорттың» бір түрі. Бұған қарағанда объектілер иерархиясы – бұл кіру принципі бойынша иерархия, яғни «бұл оның бөлігі». Мысалы, «құру – завод бөлігі», «двигатель – машина бөлігі». Сонымен, төменгі деңгей иерархиясының объектілері олар үшін топ болып табылатын жоғары деңгей иерархиясының объектілеріне кірістіріледі.

Итератор.

Итераторлар белгілі мәліметтердің әрбір элементінің кейбір әдістерін орындауға рұқсат етеді.

For all терім элементтері {әрекет}

Мұндай цикл барлық терім үшін орындала алар еді, мысалы, терімнің барлық элементтерін басып шығару үшін немесе негізгі шартты қанағаттандыратын кейбір элементті іздейтін және бұл жағдайда мұндай цикл ізделінді элемент табылған кезде аяқталады.

Біз итераторларды топқа қосылған, барлық объектілерге арналған кейбір әдістерді орындауға мүмкіндік беретін класс топтарының негізгі әдісі ретінде қарастырамыз. Итераторлар мысалына Show әдісі келеді.

Біз топтың барлық элементтерінің әрекеттерін, объектінің біреуімен ғана емес, пайдаланушының өз бетімен берген функциясымен орындауға рұқсат ететін итератордың болуын қалаймыз. Егер бұл функцияны оған функция көрсеткіші арқылы жіберсек, мұндай итераторды іске асыруға болады

Функцияға көрсеткіш типін келесі түрде анықтайық:

typedef void(*PF)(TObject*,< қосымша параметрлер>);

Функцияда TObject немесе TObject* типті міндетті параметр болады. Осы параметрлер арқылы қажетті айқын әрекеттерді орындау үшін оған объект беріледі.

Итератор-әдіс келесі түрде жазылады:

void TGroup::ForEach(PF action,< қосымша параметрлер >);

мұндағы

action функцияға топтың әрбір элементі үшін шақырылатын жалғыз міндетті параметрлі көрсеткіш;

қосымша параметрлер  жіберілген шақырылушы функцияның параметрлері.

Содан соң функция көрсеткіші анықталады және функция итераторына тапсырылған инициализацияланады.

PF pf=myfunc;

Сол уақытта итератор шақырылады, мысалы, қосымша параметріне арналған int типі үшін мынадай:

gr.ForEach(pf,25);

Мұндағы gr  топ-объект.

Типтердің динамикалық теңестірілуі.

Типтің динамикалық теңестірілуі полиморфизмге сүйенетін тілдер үшін тән. Бұл тілдерде компиляция кезеңінде объект типі белгісіз болатын жағдайлар болуы мүмкін.

С++ тілінде полиморфизм кластар иерархиясы, виртуальді функциялар және базалық класқа көрсеткіштер арқылы сүйемелденеді.

Топ әртүрлі кластардың объектілерін қамти отырып, тек қана белгілі класс объектілеріне арналған кейбір әрекеттерді орындасын. Сонда біз итераторда кезекті объектінің типін тануымыз қажет.

С++ тілінің стандартына RTTI (Run-Time Type Idendification)  типтердің динамикалық теңестірілу құралдары қосылған. Бұл құралдар Borland C++ соңғы жүйелерінде жүзеге асырылған.

Объект типінің анықтамасын typeid операторының көмегімен аламыз, ол <typeinfo.h> тақырыптық файлында қамтылған.

Typeid операторының екі формасы бар:

typeid (объект)

typeid (тип аты)

typeid операторы сілтемені type_info типті объектіге қайтарады.

type_info класында қайта жүктелген == және != амалдары типтерді салымтыруды қамтамасыз етеді.

name () функциясы тип атына көрсеткішті қайтарады.

Бір шектеу бар. Typeid операторы тек виртуальді функциялары анықталған объектілермен ғана дұрыс жұмыс жасайды.

Мысалдар.

1.

#include<iostream.h>

#include<typeinfo.h>

class Base{

virtual void f(){};

//…

};

class Derived: public Base{

//…

};

void main()

{int i;

Base ob,*p;

Derived ob1;

cout<<typeid(i).name(); // int шығарылады

p=&ob1;

cout<<typeid(*p).name(); // Derived шығарылады

}

2.

//басы жоғарыда

void WhatType(Base& ob)

{cout<< typeid(ob).name()<<endl;

}

void main()

{

Base ob;

Derived ob1;

WhatType(ob); // Base шығарылады

WhatType(ob1); // Derived шығарылады

}

3.

//басы жоғарыда

void main()

{

Base *p;

Derived ob;

p=&ob;

if(typeid(*p)==typeid(Derived)) cout<<“p Derived типті объектіге сілтейді”;

}