80
Objektorientētas programmēšanas pamati

Objektorientētas programmēšanas pamati

  • Upload
    abeni

  • View
    59

  • Download
    0

Embed Size (px)

DESCRIPTION

Objektorientētas programmēšanas pamati. Objektorientētā programmēšana (OOP) - tā ir programmu izstrādāšanas metodika, kuras pamatā ir jēdziens objekts. Objekts - tas ir daža struktūra, kas ir attiecīga reālas pasaules objektam, viņa uzvedībai. Pamatjēdzieni un principi ООP. - PowerPoint PPT Presentation

Citation preview

Page 1: Objektorientētas programmēšanas pamati

Objektorientētas programmēšanas pamati

Page 2: Objektorientētas programmēšanas pamati

Objektorientētā programmēšana

(OOP) - tā ir programmu izstrādāšanas

metodika, kuras pamatā ir jēdziens

objekts. Objekts - tas ir daža struktūra,

kas ir attiecīga reālas pasaules

objektam, viņa uzvedībai.

Page 3: Objektorientētas programmēšanas pamati

Pamatjēdzieni un principi ООP.

Objektorientētā programmēšana turas uz

četriem pamatjēdzieniem: abstrakcija,

pārmantojamība, iekapsulēšana un

polimorfisms. Īsi apstāsimies uz katra

no jēdzieniem.

Page 4: Objektorientētas programmēšanas pamati

Abstrakcija

Abstrakcija noslēdzas ārēju objekta īpašību priekšstatā bez viņa iekšējās organizācijas un konkrētas realizācijas uzskaites. Abstrakcija – tā ir programmēšanas valodas spēja aprakstīt apkārtējas pasaules objektus ietvaros liktā uzdevuma. Ar objektu, kurš ir pakļauts aprakstam, var būt viss ko vēlies: cilvēks, ēka, automobilis un tā tālāk. No redzes viedokļa konkrēta uzdevuma mūs parasti neinteresē visi objekta raksturojumi.

Page 5: Objektorientētas programmēšanas pamati

Ja mēs aprakstām cilvēku kā bankas klientu

ienešanas procesa automatizācijai uz kontu

un dažu summu noņemšanu no konta, mēs

diez vai interesēs tādas cilvēka īpašības, kā

svaru, augšanu, rakstura tipu, acu un matu

krāsu. Mums ievajadzēsies konta numurs,

naudas daudzums, dati, kas apstiprina

personību, mājas adresi u.t.t.

Page 6: Objektorientētas programmēšanas pamati

Visticamāk, mēs nosauksim šo objektu

«Klients», un ar zem tā apkopoto nosaukumu

pacentīsimies vākt visus raksturojumus

(īpašības) banku dokumentācijas pareizai

noformēšanai. Bez tam, mēs pacentīsimies

izcelt un nokārtot darbības, kuras notiek ar šo

objektu noņemšanas vai ienešanas naudas

laikā, aprakstīsim visu to programmēšanas

valodas termiņos.

Page 7: Objektorientētas programmēšanas pamati

Rezultātā mēs saņemsim dažu klienta apkopoto tipu, kam ir parametru tipi, kuri ir kopīgi visiem klientiem, un mākošs izmainīt šos parametrus ar tēlu, kurš ir kopīgs visiem klientiem.

Programmēšanas valodas spēja pārvest

reālas pasaules parādības abstraktos

objektos ar to īpašībām un uzvedību (tas ir

radīt klases) un dēvējas ar abstrakciju.

Page 8: Objektorientētas programmēšanas pamati

Reālas pasaules jebkuru objektu pārvedumā programmēšanas valodas terminos parasti apraksta divas bāziskas lietas:• ka šis objekts no sevis iedomājas, kādi viņam ir esamas īpašības un kādā daudzumā. Ar citiem vārdiem pārrakstās objekta (dati var būt atšķirīgu tipu) dati un šie apraksti dēvējas ar objekta laukiem;• kā objekts uzvedas, kādas darbības viņš ir spējīgs veikt tajā vai citā situācijā, kā objekts var manipulēt ar savējiem laukiem, un kādas reakcijas uz ārējām īsziņām viņš var nodrošināt. Šīs darbības pārrakstās ar procedūrām un funkcijām, kuras saņēma nosaukumu objekta metodes.

Page 9: Objektorientētas programmēšanas pamati

Pārmantojamība

Pārmantojamību pārstāv objektu hierarhijas

būves princips no kopīgāka un vienkārša pie

daudz konkrētam un sarežģītam. Salīdzinot

atšķirīgu reālu objektu īpašības, var izcelt

īpašību grupu, kas ir vienādas tiem visiem.

Page 10: Objektorientētas programmēšanas pamati

Tad ir jēgu radīt klasi-sencis (vecāki), kurā

apvienot laukus un metodes, kas ir kopīgi

atšķirīgiem objektiem, bet no šīs klases radīt

citas klases ar savējo specifiku, pie tam katra

radāmā klase manto visus laukus un vecāku

klases metodes.

Page 11: Objektorientētas programmēšanas pamati

Viena objekta spēja būt radītam no

cita objekta, uzņemot visas viņa

īpašības un uzvedību, dēvējas ar

pārmantojamību.

Page 12: Objektorientētas programmēšanas pamati

Pārmantojamība pakļaujas dažiem likumiem un ir savējā terminoloģija:• objekts, no kura ir radāms cits objekts, dēvējas ar bāzisku klasi, vecāku klasi vai senci;• radītais objekts dēvējas ar klasi-mantotājs, atvasinātu klasi vai pēcnācēju;• pēcnācējs var tikai pielikt savējā izsludināšanā kaut kas pie tā, ko viņš mantoja no bāziskas klases, bet nevar nekā aizvākt. Tādējādi, pēcnācējs vienmēr nes aiz sevis visas bāziska objekta pazīmes un īpašības;

Page 13: Objektorientētas programmēšanas pamati

- pie atvasinātas klases var būt tikai viena

bāziska klase. Tas dēvējas ar vienkārtēju

pārmantojamību un rada objektu hierarhiju,

kurā pie visām klasēm bez izņēmuma ir

vienmēr esams kaut vai viens kopīgs sencis

(Delphi vidē tā ir Tobject klase).

Page 14: Objektorientētas programmēšanas pamati

Iekapsulēšana

Zem iekapsulēšanas domājas klases

(objekta) spēja slēpt no ārpasaules

nevajadzīgas realizācijas detaļas, un tieši –

lauki un metodes, kuras ir vajadzīgas tikai

iekšējam klases darbam un nevar būt derīgi

programmētājiem, kas rada šīs klases

objektus vai izmantojoši šo klasi kā bāzisks.

Page 15: Objektorientētas programmēšanas pamati

Tādējādi, labi iekapsulētā klasē no ārpuses ir redzami tikai tie lauki un metodes, kuras būs derīgas, un labi ir apslēpti lauki un metodes, kuras ir nepieciešamas tikai iekšējam klases darbam. Bez slēpšanas nevajadzīgu lauku un metožu iekapsulēšanas domā uzticamu objekta neatkarību. Tas nozīmē, ka viss nepieciešams klases darbam vajag būt realizētam iekšpus objekta, bet visi resursi, kurus objekts sagrābj savējā darba laikā, viņam pašam ir korekti jāatbrīvo (piemēram, taisīt ciet pēc sev failus un atbrīvot sagrābto atmiņu).

Page 16: Objektorientētas programmēšanas pamati

Polimorfisms

Programmēšanā efekts, kad viena un tā pati

komanda, kas ir pievērsta pie dažādiem

objektiem, tiek izpildīta ar tiem pie katra pa

savu, dēvējas ar polimorfismu. Polimorfisms

ļauj programmētājam nevis rūpēties par

uzrunu pie katra objekta atsevišķā, bet gan ir

vienkārši norādīt objektu grupai izpildīt vienu

un to pašu komandu.

Page 17: Objektorientētas programmēšanas pamati

Objektu klases

Katrs objekts vienmēr pieder dažai objektu

klasei. Objektu klase - tas ir viena tipa

objektu lielas kopas apkopotais (abstrakts)

apraksts. Objekti ir savējās klases konkrētie

pārstāvji, tos pieņemts saukt par klases

eksemplāriem. Piemēram, Suns klase ir

jēdziens abstrakts, bet šīs klases eksemplārs

Manējais Suns BOBIK ir jēdziens konkrēts.

Page 18: Objektorientētas programmēšanas pamati

Klases

OOP atbalstam Delphi valodā ir ievesti

objektu datu tipi, ar kuru palīdzību vienlaikus

aprakstītās dati un operācijas pār tiem.

Objektu datu tipi sauc par klasēm, bet to

eksemplāri - ar objektiem.

Page 19: Objektorientētas programmēšanas pamati

Objektu klases tiek noteiktas globāla bloka type

sekcijā. Klases apraksts iesākas no atslēgu vārda

class un noslēdzas ar atslēgu vārdu end. Pa formu

izsludināšanas klases ir līdzīgas parastiem

ierakstiem, bet bez datu laukiem var saturēt lietotāja

procedūru un funkciju izsludināšanas. Tādas

procedūras un funkcijas apkopoti sauc par

metodēm, tie ir paredzēti dažādu operāciju izpildei

ar objektiem.

Page 20: Objektorientētas programmēšanas pamati

Piemērs 1.

Minēsim klases izsludināšanas piemēru, kura

ir paredzēta tekstu faila lasīšanai "delimited

text” formātā (fails tādā formātā pārstāv rindu

secīgumu; katra rinda sastāv no nozīmēm,

kuras nodalīja viens no otra simbols-

atdalītājs):

Page 21: Objektorientētas programmēšanas pamati

type

TDelimitedReader = class

// Lauki

FileVar: TextFile;

Items: array of string;

Delimiter: Char;

// Metodes

procedure PutItem(Index: Integer; const Item: string);

procedure SetActive(const AActive: Boolean);

function ParseLine(const Line: string): Integer;

function NextLine: Boolean;

function GetEndOfFile: Boolean;

end;

Page 22: Objektorientētas programmēšanas pamati

Klase satur laukus (Filevar, Items, Delimiter)

un metodes (PutItem, SetActive, ParseLine,

NextLine, GetEndOffile). Metožu virsraksti

vienmēr ir nākami aiz lauku saraksta.

Programmisks metožu kods ir uzrakstāms

atsevišķi no klases definēšanu un tiks atvests

vēlāk.

Page 23: Objektorientētas programmēšanas pamati

Klase parasti apraksta būtību, kas ir

modelējama programmā. Piemēram,

Tdelimitedreader klasi pārstāv tekstu faila

"lasītājs" ar salasījumu rindu izjaukšanu uz

elementiem (apakšrindām), kurus nodalīja

viens no otra dažs simbols, saucamais

atdalītājs.

Page 24: Objektorientētas programmēšanas pamati

Klase satur daži lauku:

• Filevar ir failu mainīgais, kas ir

nepieciešams piekļūšanai pie faila;

• Delimiter - simbols, kurš kalpo par elementu

atdalītāju;

• Items - elementu masīvs, ko saņēma

pēdējās salasīdamas rindas izjaukšana;

Page 25: Objektorientētas programmēšanas pamati

Klase tāpat satur metožu rindu (procedūru un funkciju): • PutItem - novieto elementu Items masīvā pa Index indeksu; ja indekss pārsniedz augšēju masīva robežu, tad masīva izmērs automātiski palielinās; • SetActive - ver vaļā vai taisa ciet failu, no kura ir ražojama rindu lasīšana;• ParseLine - īsteno rindas izjaukšanu: iedala elementus no rindas un novieto tos Items masīvā; atdod izcelto elementu daudzumu;

Page 26: Objektorientētas programmēšanas pamati

• NextLine – nolasa kārtējo rindu no faila un

ar ParseLine metodes palīdzību īsteno tās

izjaukšanu; kārtējās rindas sekmīgās

lasīšanas gadījumā funkcija atdod nozīmi

True, bet citādi - nozīme False (ir sasniegtas

faila beigas);

• GetEndOffile - atdod būla vērtību, kas

rāda, vai ir sasniegtas faila beigas.

Page 27: Objektorientētas programmēšanas pamati

Pievērsīsiet uzmanību, ka apraksts, kurš ir

atvests augstāk, ir nekas cits, kā interfeisa

deklarācija darbam ar Tdelimitedreader

klases objektiem. PutItem , SetActive,

ParseLine, NextLine un GetEndOffile metožu

realizācijas uz šo brīdi nav, tomēr radīšanai

un klases eksemplāru izmantošanai viņa

pagaidām un nevajadzīga.

Page 28: Objektorientētas programmēšanas pamati

ObjektiLai no klases apraksta pārietu pie objekta, vajag izpildīt atbilstošo izsludināšanu var sekcijā:

var Reader: Tdelimitedreader;Šīs izsludināšanas darbā ar parastiem datu tipiem būtu pietiek tipa eksemplāra saņemšanai. Tomēr objekti Delphi vidē ir dinamiski dati, t.i. izkārtojas dinamiskā atmiņā.

Page 29: Objektorientētas programmēšanas pamati

Tādēļ mainīgais Reader - tas ir vienkāršs

atsauce uz eksemplāru (objekts ir atmiņā),

kurš fiziski vēl neeksistē. Lai konstruētu

Tdelimitedreader klases objektu (izcelt

atmiņu eksemplāram) un sasaistītu ar viņu

mainīgu Reader, vajag programmas tekstā

novietot sekojošo operatoru:

Reader := Tdelimitedreader.Create;

Page 30: Objektorientētas programmēšanas pamati

Create - tas ir tā saucamais objekta

konstruktors; viņš vienmēr ir klāt klasē un

kalpo eksemplāra radīšanai un inicializēšanai.

Radot objektu atmiņā izceļas vieta tikai viņa

laukiem. Metodes, tāpat kā parastas

procedūras un funkcijas, novietojas

programmas koda apgabalā; tie māk strādāt

ar savējās klases jebkuriem eksemplāriem un

nedublējas atmiņā.

Page 31: Objektorientētas programmēšanas pamati

Pēc radīšanas objektu var izmantot programmā: saņemt un uzstādīt viņa lauku vērtības, izsaukt viņa metodes. Piekļūšana pie laukiem un objekta metodēm notiek ar precizēto vārdu palīdzību, piemēram:

Reader.NextLine;

Bez tam, tāpat kā darbā ar ierakstiem, pieļaujams with operatora izmantošana, piemēram: with Reader do Nextline;

Page 32: Objektorientētas programmēšanas pamati

Ja objekts top nevajadzīgs, viņš ir jāattālina ar

speciālas Destroy metodes izsaukumu,

piemēram:

Reader.Destroy; // atmiņas atbrīvošana, ko

aizņem objekts

Destroy - tā ir tā saucamais objekta

destruktors; viņš ir klāt klasē līdzās

konstruktoram un kalpo objekta noraidīšanai

no dinamiskas atmiņas.

Page 33: Objektorientētas programmēšanas pamati

Pēc destruktora izsaukuma mainīgais Reader top

nesaistīts un nav jāizmanto piekļūšanai pie laukiem

un metodēm jau neesošā objekta. Lai atšķirtu

programmā saistītus objekta mainīgus no

nesaistītiem, pēdēji vajag inicializēt ar nil vērtību.

Piemēram, sekojošajā fragmentā uzruna pie Destroy

destruktoram tiek izpildīta tikai tajā gadījumā, ja

objekts reāli eksistē:

Reader := nil;

...

if Reader <> nil then Reader.Destroy;

Page 34: Objektorientētas programmēšanas pamati

Destruktora izsaukums neesošajiem objektiem nepieņemsim un izpildot programmu atvedīs pie kļūdas. Lai atpestītu programmētājus no liekām kļūdām, objektos ieveda iepriekš noteiktu Free metodi, kuru vajag izsaukt destruktora vietā. Free metode pats izsauc Destroy destruktoru, bet tikai tajā gadījumā, ja objekta mainīga vērtība nav vienāda nil. Tādēļ pēdējo rindiņu piemērā, kurš ir minēts augstāk, var pārrakstīt sekojoši. Reader.Free;

Page 35: Objektorientētas programmēšanas pamati

Piemērs 2.

Iekapsulēšana un īpašības

Par iekapsulēšanu tiek saprasta objekta lauku slēpšana ar piekļūšanas nodrošinājuma mērķi pie tiem tikai ar klases metožu palīdzību. Delphi valodā piekļūšanas ierobežojums pie objekta laukiem realizēsies ar objekta īpašību palīdzību. Objekta īpašība ir raksturojama ar lauku, kas saglabā īpašības vērtību, un divām metodēm (write un read), kas nodrošina piekļūšanu pie īpašības lauka.

Page 36: Objektorientētas programmēšanas pamati

Klases aprakstā pirms īpašības vārda ieraksta property vārdu (īpašība). Pēc īpašības vārda ir norādāms viņa tips, pēc tam - metožu vārdi, kas nodrošina piekļūšanu pie īpašības nozīmes. Pēc read vārda ir norādāms metodes vārds, kas nodrošina īpašības lasīšanu, pēc write vārda - metodes vārds, kas atbild par īpašības ierakstu.

Zemāk ir minēts Tperson klases apraksta piemērs, kas satur divas īpašības: Name Un Address.

Page 37: Objektorientētas programmēšanas pamati

type

TName = string[15]; TAddress = string[35];

TPerson = class // klase

private

FName: TName; // Name īpašības vērtība

FAddress: TAddress; // Address īpašības vērtība

Constructor Create(Name:Tname);

Procedure Show;

Function GetName: TName;

Function GetAddress: TAddress;

Procedure SetAddress(NewAddress:TAddress);

Page 38: Objektorientētas programmēšanas pamati

public

Property Name: Tname // īpašība Name

read GetName; // tikai lasīšana

Property Address: TAddress // īpašība

Address

read GetAddress // lasīšāna

write SetAddress; // un ierakstīšana

end;

Page 39: Objektorientētas programmēšanas pamati

Programmā īpašības vērtības uzstādīšanai nevis vajag ierakstīt īpašības vērtības uzstādīšanas metodes pielietojuma pie objekta instrukciju, bet gan ir jāieraksta vērtības īpašībai piesavināšanās parastu instrukciju. Piemēram, lai piesavinātos vērtību student objekta Address īpašībai, pietiek ierakstītstudent.Address := ‘Daugavpils, Smilšu ielā 21,dz.3';Kompilators pārtranslē vērtības īpašībai piesavināšanās atvesto instrukciju metodes izsaukuma instrukcijāstudent.SetAddress(‘Daugavpils, Smilšu ielā 21,dz.3 ');

Page 40: Objektorientētas programmēšanas pamati

Uzstādīt īpašības vērtību, kas ir aizsargāta no ieraksta, var objekta inicializēšanas laikā. Zemāk ir atvestas Tperson klases metodes, kas nodrošina objekta Tperson klases radīšanu un piekļūšana pie viņa īpašībām.

// Tperson objekta konstruktors Constructor TPerson.Create(Name:TName); begin FName:=Name; end;// īpašības Name vērtības saņemšanas metodeFunction TPerson.GetName;begin Result:=FName; end;

Page 41: Objektorientētas programmēšanas pamati

// īpašības Address vērtības saņemšanas metode

function TPerson.GetAddress;begin Result:=FAddress; end;

// īpašības Address vērtības izmaiņas metode Procedure TPerson.SetAddress(NewAddress:TAddress); begin if FAddress = ‘’ then FAddress := NewAddress; end;

Page 42: Objektorientētas programmēšanas pamati

Tperson objekta konstruktors rada objektu un uzstāda Fname lauka vērtību, kas noteic Name īpašības vērtību.

Instrukcijas programmas, kas nodrošina Tperson klases objekta radīšanu un viņa īpašības uzstādīšanu, var būt, piemēram, tādi:

student := Tperson.Create('Ivanovs');

student.Address := ‘Smilšu ielā, m.3, dz.25';

Page 43: Objektorientētas programmēšanas pamati

Pārmantojamība

Objektorientētas programmēšanas koncepcija paredz iespēju noteikt jaunas klases ar lauku, īpašību un metožu piemetinājuma palīdzību pie jau eksistējošajām klasēm. Jaunu klašu saņemšanas tāds mehānisms dēvējas ar radīšanu. Pie tam jauna, radītā klase (pēcnācējs) manto savējās bāziskās, vecāku klases īpašības un metodes.

Page 44: Objektorientētas programmēšanas pamati

Klases-pēcnācēja izsludināšanā ir norādāma vecāku klase. Piemēram, Temployee (līdzstrādnieks) klase var būt radīts no Tperson klases, kura ir aplūkota augstāk, ar Fdepartment (nodaļa) lauka pielikšanu. Templioyee klases izsludināšana šajā gadījumā var izskatīties tā:Temployee = class(Tperson) Fdepartment: string; // nodaļas nosaukums constructor Create(Name:tname;Dep:integer); end;Tperson klases vārds, kurš ir noslēgts iekavas, rāda, ka Temployee klase tiek atvasināta no Tperson klases. Savukārt, Tperson klase ir bāzisks Temployee klasei.

Page 45: Objektorientētas programmēšanas pamati

Temployee klasei jābūt savējo personīgo konstruktoru, kas nodrošina klases-vecāku un savējo lauku inicializēšanu. Lūk Temployee klases konstruktora realizācijas piemērs:

constructor Temployee.Create(Name:tname;Dep:integer);

begin inherited Create(Name); Fdepartment:=dep;end; Minētajā piemērā ar inherited direktīvu izsaucas vecāku klases konstruktors. Pēc tā piesavinās vērtība klases-pēcnācēja laukam.

Page 46: Objektorientētas programmēšanas pamati

Pēc atvasinātas klases objekta radīšanas programmā var izmantot laukus un vecāku klases metodes. Zemāk ir atvests programmas fragments, kas demonstrē šo iespēju.

engineer := Temployee.Create('Sidorov',’RTU DF’);

engineer.address := ‘Jātnieku ielā m.8, dz.10';

Pirmā instrukcija rada tipa Temployee objektu, otrā - uzstāda īpašības vērtību, kura attiecas pret vecāku klasi.

Page 47: Objektorientētas programmēšanas pamati

Redzamības līmeņi

Klases atribūtiem iespējami četri aizsardzības līmeņi:

Private (privātie) - pieejami tikai šīs klases metodēm, klases

apakšklasē nav pieejami.

Protected (aizsargātie) - pieejami šīs klases apakšklasēm,

kuras tos var atstāt aizsargātus vai padarīt publiskus.

Public (publiskie) - pieejami no ārpuses, paliek publiski arī

apakšklasē.

Published (publicētie) – pēc aizsardzības pakāpes līdzīgi

publiskajiem.

Page 48: Objektorientētas programmēšanas pamati

Protected un private direktīvas

Bez klases (lauku, metožu, īpašību) elementu

izsludināšanai klases apraksts, kā likums,

satur protected (aizsargāts) un private

(aizvērts) direktīvas, kuri uzstāda klases

elementu redzamības pakāpi programmā.

Page 49: Objektorientētas programmēšanas pamati

Klases elementi, kas ir izziņoti protected

sekcijā, ir pieejami tikai klasēs, kuras ir

radītas no viņa. Šīs sekcijas klases elementu

redzamības apgabals neaprobežojas ar

moduli, kurā atrodas klases apraksts. Parasti

protected sekcijā novieto klases metožu

aprakstu.

Page 50: Objektorientētas programmēšanas pamati

Klases elementi, kas ir izziņoti private

sekcijā, redzami tikai iekšpus moduļa. Šie

elementi nav pieejami aiz robežām moduļa,

pat atvasinātās klasēs. Parasti private sekcijā

novieto klases lauku aprakstu, bet metodes,

kas nodrošina piekļūšanu pie šiem laukiem,

novieto protected sekcijā.

Page 51: Objektorientētas programmēšanas pamati

TPerson = class private FName: TName; // Name īpašības vērtība FAddress: TAddress; // Address īpašības vērtībaprotected Constructor Create(Name:TName); Function GetName: TName; Function GetAddress: TAddress; Procedure SetAddress(NewAddress:TAddress); Property Name: TName read GetName; Property Address: TAddress read GetAddress write SetAddress; end;

Page 52: Objektorientētas programmēšanas pamati

Polimorfisms un virtuālas metodes

Polimorfisms - tā ir iespēja izmantot vienādus vārdus metodēm, kas ienāk dažādās klasēs. Polimorfisma koncepcija nodrošina tieši tās metodes izmantošanu, kura atbilst objekta klasei.

Lai ir noteiktas trīs klases, viens no kuriem ir bāzisks diviem citiem:

Page 53: Objektorientētas programmēšanas pamati

tуре// bāzes klase TPerson = class fname: string; // имя constructor Create(name:string); function info: string; virtual; end;// atvasinātā klase no TPerson TStud = class(TPerson) fgr:integer; // mācību grupas numurs constructor Create(name:string;gr:integer); function info: string; override; end;// atvasinātā klase no TPerson TProf = class(TPerson) fdep:string; // katedras nosaukums constructor Create(name:string;dep:string); function info: string;override; end;

Page 54: Objektorientētas programmēšanas pamati

Katrā no šīm klasēm ir noteikta info metode. Bāziskā klasē ar direktīvas palīdzību virtual info metode ir izziņota virtuāla. Metodes izsludināšana virtuāla dod iespēju meitas klasei ražot virtuālas metodes aizstāšanu savējais personīgais. Katrā meitas klasē ir noteikta savējā info metode, kurš aizvieto vecāku klases atbilstošo metodi (radītās klases metode, kas aizvieto vecāku klases virtuālu metodi, iezīmējas ar override direktīvu).

Zemāk ir atvesta info metodes definēšana katrai klasei.

Page 55: Objektorientētas programmēšanas pamati

function TPerson.info:string; begin result := '';end;

function TStud.info:string; begin result := fname + ' gr.' + IntTostr(fgr);end;

function TProf.info:string; begin result := fname + ' kat.' + fdep; end;

Page 56: Objektorientētas programmēšanas pamati

Programmas piemērs, kura saformē un izved studentu un pasniedzēju sarakstu.

Dialoglodziņš:

Page 57: Objektorientētas programmēšanas pamati

unit polimor_;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; GroupBox1: TGroupBox; RadioButton1: TRadioButton; RadioButton2: TRadioButton; Label1: TLabel; Label2: TLabel; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;

Page 58: Objektorientētas programmēšanas pamati

// bāzes klase TPerson = class fName: string; // Vārds, Uzvārds constructor Create(name:string); function info:string; virtual; end; // klase Students TStud = class(TPerson) fGr:string; // Grupas nosaukums constructor Create(name:string;gr:string); function info:string; override; end;

// Klase pasniedzējs TProf = class(TPerson) fdep:string; // nodaļa constructor Create(name:string;dep:string); function info:string; override; end;

Page 59: Objektorientētas programmēšanas pamati

const SZL = 10; // Saraksta daudzums n:integer = 0; // Cilvēku skaits sarakstā

var Form1: TForm1; List: array[1..SZL] of TPerson; // sarakstsImplementation{$R *.DFM}constructor TPerson.Create(name:string); begin fName := name; end;

Page 60: Objektorientētas programmēšanas pamati

constructor TStud.Create(name:string;gr:string); begin inherited create(name); // bāzes klases konstruktora izsaukums fGr := gr; end;

constructor TProf.create(name:string; dep:string); begin inherited create(name); // bāzes klases konstruktora izsaukums fDep := dep; end;

Page 61: Objektorientētas programmēšanas pamati

function TPerson.Info:string; begin result := fname; end;function TStud.Info:string; begin result := fname + ' gr.' + fGr; end;function TProf.Info:string; begin result := fname + ' kat.' + fDep; end;

Page 62: Objektorientētas programmēšanas pamati

// Poga "Papildināt"procedure TForm1.Button1Click(Sender: TObject); begin if n < SZL then begin // papildināt sarakstu n:=n+1; if Radiobutton1.Checked then // veidot objektu TStud List[n]:=TStud.Create(Edit1.Text,Edit2.Text) else // veidot objektu TProf List[n]:=TProf.Create(Edit1.Text,Edit2.Text); // attīrīt ievades laukus Edit1.Text := ''; Edit2.Text := ''; Edit1.SetFocus; // ievietot kursoru "Uzvārds" laukā end else ShowMessage('saraksts ir aizpildīts!');end;

Page 63: Objektorientētas programmēšanas pamati

// Poga "Saraksts"procedure TForm1.Button2Click(Sender: TObject);var i:integer; // indekss st:string; // sarakstsbegin for i:=1 to SZL do if list[i] <> NIL then st:=st + list[i].info + #13; ShowMessage ('Saraksts'+#13+st);end;end.

Page 64: Objektorientētas programmēšanas pamati

Piemērs 2.

{type} Tpunkts = class protected punktX,punktY:integer; public constructor create (x,y:integer); virtual; procedure paradit; virtual; procedure paslept; virtual; end;

Page 65: Objektorientētas programmēšanas pamati

Tlinija = class (Tpunkts)

protected

punktx1,punkty1:integer;

public

constructor create(x,y,x1,y1:integer);

reintroduce;

procedure paradit; override;

procedure paslept; override; end;

Page 66: Objektorientētas programmēšanas pamati

Ttrissturis = class (Tlinija)

protected

punktx2,punkty2:integer;

public

constructor create (x,y,x1,y1,x2,y2:integer);

reintroduce;

procedure paradit; override;

procedure paslept; override; end;

Page 67: Objektorientētas programmēšanas pamati

TAploce = class (Tpunkts) protected radiuss:integer; public constructor create (x,y,r:integer); reintroduce; procedure paradit; override; procedure paslept; override; end;var Form1: TForm1; punkts1:tpunkts; linija1:tlinija; trissturis1:Ttrissturis; aploce:Taploce; x,y,x1,y1,x2,y2,r:integer;implementation

Page 68: Objektorientētas programmēšanas pamati

constructor Tpunkts.create (x,y:integer);begin punktX := x; punktY := y;end;constructor Tlinija.create (x,y,x1,y1:integer);begin inherited create (x,y); punktX1 := x1; punktY1 := y1;end;constructor TAploce.create (x,y,r:integer);begin inherited create (x,y); radiuss := r;end;

Page 69: Objektorientētas programmēšanas pamati

constructor Ttrissturis.create (x,y,x1,y1,x2,y2:integer);begin inherited create (x,y,x1,y1); punktX2 := x2; punktY2 := y2;end;

procedure Tpunkts.paradit; begin form1.image1.canvas.pixels[punktx,punkty]:=clred ; end;procedure Tpunkts.paslept; begin form1.image1.canvas.pixels[punktx,punkty]:=clwhite; end;

Page 70: Objektorientētas programmēšanas pamati

procedure Tlinija.paradit; begin form1.image1.Canvas.Pen.Color :=clred; form1.image1.Canvas.moveto(punktx,punkty); form1.image1.canvas.lineto(punktx1,punkty1); end;procedure Tlinija.paslept; begin form1.image1.Canvas.Pen.Color :=clWhite; form1.image1.Canvas.moveto(punktx,punkty); form1.image1.canvas.lineto(punktx1,punkty1); end;

Page 71: Objektorientētas programmēšanas pamati

procedure TAploce.paradit; begin form1.image1.Canvas.Pen.Color :=clred; form1.image1.Canvas.ellipse(punktx-radiuss,punkty-radiuss, punktx+radiuss,punkty+radiuss); end;procedure TAploce.paslept; begin form1.image1.Canvas.Pen.Color :=clWhite; form1.image1.Canvas.ellipse(punktx-radiuss,punkty-

radiuss, punktx+radiuss,punkty+radiuss); end;

Page 72: Objektorientētas programmēšanas pamati

procedure Ttrissturis.paradit; begin form1.image1.Canvas.Pen.Color :=clred; form1.image1.Canvas.moveto(punktx,punkty); form1.image1.canvas.lineto(punktx1,punkty1); form1.image1.Canvas.moveto(punktx1,punkty1); form1.image1.canvas.lineto(punktx2,punkty2); form1.image1.Canvas.moveto(punktx2,punkty2); form1.image1.canvas.lineto(punktx,punkty); end;procedure Ttrissturis.paslept; begin form1.image1.Canvas.Pen.Color :=clwhite; form1.image1.Canvas.moveto(punktx,punkty); form1.image1.canvas.lineto(punktx1,punkty1); form1.image1.Canvas.moveto(punktx1,punkty1); form1.image1.canvas.lineto(punktx2,punkty2); form1.image1.Canvas.moveto(punktx2,punkty2); form1.image1.canvas.lineto(punktx,punkty); end;

Page 73: Objektorientētas programmēšanas pamati

procedure TForm1.Button1Click(Sender: TObject);begin close;end;

procedure TForm1.FormCreate(Sender: TObject);begin punkts1:=tpunkts.Create(x,y); linija1:=tlinija.Create(x,y,x1,y1); trissturis1:=ttrissturis.Create (x,y,x1,y1,x2,y2); aploce := taploce.create (x,y,r);end;

Page 74: Objektorientētas programmēšanas pamati

procedure TForm1.Button10Click(Sender: TObject);var xp,yp:integer;begin xp:= strtoint(edit7.text); yp:= strtoint(edit8.text); punkts1.punktx:=xp; punkts1.punkty:=yp; punkts1.paradit;end;procedure TForm1.Button11Click(Sender: TObject);var xp,yp:integer;begin xp:= strtoint(edit7.text); yp:= strtoint(edit8.text); punkts1.punktx:=xp; punkts1.punkty:=yp; punkts1.paslept;end;

Page 75: Objektorientētas programmēšanas pamati

procedure TForm1.Button2Click(Sender: TObject); var xp,yp,xp1,yp1:integer;begin xp:= strtoint(edit1.text); yp:= strtoint(edit2.text); xp1:= strtoint(edit9.text); yp1:= strtoint(edit10.text); linija1.punktx:=xp; linija1.punkty:=yp; linija1.punktx1:=xp1; linija1.punkty1:=yp1; linija1.paradit;end;

Page 76: Objektorientētas programmēšanas pamati

procedure TForm1.Button3Click(Sender: TObject);var xp,yp,xp1,yp1:integer;begin xp:= strtoint(edit1.text); yp:= strtoint(edit2.text); xp1:= strtoint(edit9.text); yp1:= strtoint(edit10.text); linija1.punktx:=xp; linija1.punkty:=yp; linija1.punktx1:=xp1; linija1.punkty1:=yp1; linija1.paslept;end;

Page 77: Objektorientētas programmēšanas pamati

procedure TForm1.Button4Click(Sender: TObject);var xp,yp,xp1,yp1,xp2,yp2:integer;begin xp:= strtoint(edit11.text); yp:= strtoint(edit12.text); xp1:= strtoint(edit13.text); yp1:= strtoint(edit14.text); xp2:= strtoint(edit15.text); yp2:= strtoint(edit16.text); trissturis1.punktx:=xp; trissturis1.punkty:=yp; trissturis1.punktx1:=xp1; trissturis1.punkty1:=yp1; trissturis1.punktx2:=xp2; trissturis1.punkty2:=yp2; trissturis1.paradit;end;

Page 78: Objektorientētas programmēšanas pamati

procedure TForm1.Button5Click(Sender: TObject);var xp,yp,xp1,yp1,xp2,yp2:integer;begin xp:= strtoint(edit11.text); yp:= strtoint(edit12.text); xp1:= strtoint(edit13.text); yp1:= strtoint(edit14.text); xp2:= strtoint(edit15.text); yp2:= strtoint(edit16.text); trissturis1.punktx:=xp; trissturis1.punkty:=yp; trissturis1.punktx1:=xp1; trissturis1.punkty1:=yp1; trissturis1.punktx2:=xp2; trissturis1.punkty2:=yp2; trissturis1.paslept;end;

Page 79: Objektorientētas programmēšanas pamati

procedure TForm1.Button6Click(Sender: TObject); var xp,yp,xp1:integer;begin xp:= strtoint(edit3.text); yp:= strtoint(edit4.text); xp1:= strtoint(edit5.text); aploce.punktx:=xp; aploce.punkty:=yp; aploce.radiuss:=xp1; aploce.paradit;end;

Page 80: Objektorientētas programmēšanas pamati

procedure TForm1.Button7Click(Sender: TObject);var xp,yp,xp1:integer;begin xp:= strtoint(edit3.text); yp:= strtoint(edit4.text); xp1:= strtoint(edit5.text); aploce.punktx:=xp; aploce.punkty:=yp; aploce.radiuss:=xp1; aploce.paslept;end;

end.