Мұрагерлік.
Жоспар:
1. Мұрагер класс
2. Жанып өшетін нүкте мысалы
Әдебиеттер:
1.А.Г.Гольцев «Объектно-ориентированное программирование и его реализация в языке Паскаль», Москва-2005
2. В.В.Фараонов «Турбо Паскаль 7.0», Москва-2001
3. Электронный учебник: «Введение в объектно-ориентированное программирование», 2006
1. Мұрагер класс
Паскалда жаңа класстарды бар класстардың негізінде тудыру үшін мұрагерлік механизмі қарастырылған. Мұрагерлік көмегімен сондай жаңа класс тудыру керек, бұл жаңа класстардың экземплярлары шешіліп отырған мәселенің логикасы тұрғысынан аталық класс экземплярларының түрлеріне жатуы, олардың дербес жағдайы болып табылуы қажет.
Мысалы, алдын қарастырған автосервис мысалын алайық. Алдымен «автомобиль жүйелері жалпы» құрылғысын абстракт класс ретінде(өрістер құрылымы және тәсілдер жиыны, ал қайсыбір тәсілдердің конкрет реализациясы да берілуі мүмкін) сипаттап, бұдан соң, бұл класстың әртүрлілігін тудырамыз: Двигатель, ТЖ, ЖБ.
Дұрыс емес жолмен де жүруге болады. Яғни «Автомобильдің двигателі бар, демек двигательде бар нәрсе автомобильде де бар, қосымша тағы бір нәрселер де» деп ойлап, Двигатель классының мұрагері ретінде Автомобиль классын тудыруымыз мүмкін. Бұдан ешқандай дұрыс нәтиже шықпайды.
Мұрагер классты сипаттаудың синтаксисі:
type <класс атауы> = object (<аталық класс атауы>)
<жаңа өрістер тізімі>
<жаңа және қайтаанықталатын тәсіл атаулары>
end;
Мұндай сипаттаманы транслятор қалай өңдейді екен? Аталық кластың атауын көрсеткеннен кейін транслятор жаңа класс экземплярының құрылымы аталық класстың құрылымымен дәлме-дәл сәйкес түседі деп есептейді.
Бұдан әрі транслятор мұрагердің жаңа өрістер тізімін өңдейді және оларды аталық класс экземплярында бар өрістерге қосымша деп есептейді.
Бұдан бөлек, басынан-ақ транслятор мұрагер класста аталық класста бар тәсілдер дәл солай жарияланған және дәл солай жұмыс істейді деп есептейді. Егер қосымша тәсілдер ендірілетін болса, онда олардың тізімін жаңа өрістерден соң келтіріп, ал реализациясы әдеттегідей сипатталады.
Егер ата-класс үшін анықталған тәсілдің жұмыс логикасын өзгерту керек болса(мүмкін, формальді параметрлер тобын да), мұндай тәсілдің атауы да ұрпақ-кластың тәсілдер тізімінде ал оның релизациясы –ұрпақ-класс тәсілдерінің реализациялары қатарында болуы қажет.
Ата-кластың тәсілін қайта анықтау кезінде оның атауы сол күйінде қалады, ал формальді параметрлердің санын, типін, атауын өзгертуге болады
Әдетте, ата-класстың тәсілін толығымен емес, тек оның жұмысын кеңейту не айқындың енгізу талап етіледі, яғни көбінесе жаңа тәсіл аталық-тәсілдің «ісін және оған қоса тағы қандай да бір әрекет» істей алуы қажет. Әрине, ұрпақ-класстың жаңа тәсілінің ішінде аталық-класста анықталған сәйкес классты шақырып және қайсыбір әрекетті сипаттап жазуға болады. Паскальтілінің синтаксисі мұны 2 жолмен істеуге мүмкіндік береді.
Айталық, ТА аталық класта TA.meth1(x,y) тәсілі сипатталған, ал ұрпақ класста ол параметрлердің жаңа жиынымен қайта анықталады, яғни TB.meth1(x,y,z) ендіріледі. Аталық класста анықталған тәсілді шақыру үшін TB.meth1 тәсілінің ішіне былай жазуға болады:
TA.meth1(x,y);
немесе
inherited meth1(x,y);
Екі жағдайда да аталық тәсілге шақыру кезінде self ретінде ұрпақтың орыдалып жатқан тәсіліне берілетін экземплярға көрсеткіш беріледі. В обоих случаях методу предка при вызове в качестве self будет передан тот указатель на экземпляр, который передан сейчас исполняющемуся методу потомка.
Бірінші жол мұрагерлік тізбегіндегі кез-келген ата-ұрпақтың тәсілін шақыруға мүмкіндік береді. Ал, екіншісі тек тікелей тудырған класстың тәсілін шақырады. Екінші жолды қолданған дұрыс, өйткені біріншісі кейбір ОБП тілдерінде жоқ(Мысалы Дельфиде).
2. Мысал. Жанып-өшетін нүкте
Класстар иерархиясы. TBlinker – жанып-өшетін ақ-қара нүкте, TColorBlinker – жанып-өшетін түсті нүкте, TLargeColorBlinker – жанып-өшетін түсті дөңгелек(үлкен нүкте).
Әрекет. Экранда координаталарды көрсетумен инициаизация жасау, жандыру, өшіру. Өшіру –сол объектті (нүктені) қара түспен шығару. Түсті объекттерді инициалиация жасағанда қосымша объект түсі де беріледі. Кез-келген дөңгелектің(үлкен нүктенің) радиусы бірдей – 3 пикселге тең.
Байқағанымыздай, бірінші объекттің тәсілі мыналар болады: Init(x,y), Show, Hide. Екіншісінде Init басқа параметрлер тобымен(қосымша түс) және Show жұмысының логикасы да басқаша (Hide өзгермейді). Дөңгелектің тәсілі: Init –сол параметрлермен және сондай логикамен, демек мұраға алады, ал Show және Hide өзінікі.
type TBlinker=object
x,y:integer;
procedure Init(xx,yy:integer);
procedure Show;
procedure Hide;
end;
PBlinker=^TBlinker;
TColorBlinker=object(TBLinker)
Color:integer;
procedure Init(xx,yy,col:integer);
procedure Show;
end;
PColorBlinker=^TColorBlinker;
TLargeColorBlinker=object(TColorBlinker)
procedure Show;
procedure Hide;
end;
PLargeColorBlinker=^TLargeColorBlinker;
procedure TBlinker.Init(xx,yy:integer);
begin
x:=xx; y:=yy;
end;
procedure TBlinker.Show;
begin
PutPixel(x,y,White);
end;
procedure TBlinker.Hide;
begin
PutPixel(x,y,Black);
end;
procedure TColorBlinker.Init(xx,yy,col:integer);
begin
inherited init(xx,yy);
color:=col;
end;
procedure TColorBlinker.Show;
begin
PutPixel(x,y,color);
end;
procedure TLargeColorBlinker.Show;
begin
SetColor(color);
Circle(x,y,3);
end;
procedure TLargeColorBlinker.Hide;
begin
SetColor(Black);
Circle(x,y,3);
end;
Достарыңызбен бөлісу: |