Objektorienteeritud programmeerimine (OOP) on praegu kõige populaarsem programmeerimistehnoloogia. Objektorienteeritud programmeerimine on struktureeritud programmeerimistehnoloogia edasiarendus, kuid sellel on oma iseloomulikud tunnused.
Levinumad objektorienteeritud visuaalse programmeerimise süsteemid on Microsoft Visual Basic ja Borland Delphi.
Objektorienteeritud programmeerimise keskmes on objektidest rakenduste loomine, nagu maju ehitatakse plokkidest ja erinevatest osadest. Mõned objektid tuleb luua täiesti iseseisvalt, teised saab aga valmis laenutada erinevatest raamatukogudest.
Objektorienteeritud programmeerimistehnoloogias on olulisel kohal sündmus. Sündmusteks võivad olla hiireklõps objektil, teatud klahvi vajutamine, dokumendi avamine jne. Reaktsioonina sündmustele kutsutakse välja teatud protseduur, mis võib muuta objekti omadusi, kutsuda välja selle meetodeid jne.
Objektorienteeritud programmeerimissüsteemid kasutavad programmeerimisprotsessi visualiseerimiseks tavaliselt graafilist liidest. Hiire abil on võimalik luua objekte, määrata nende omadusi ja käitumist.
Objektil on ühelt poolt teatud omadused, mis iseloomustavad tema olekut antud ajahetkel, teisalt on võimalikud toimingud, mis toovad kaasa omaduste muutumise.
Objektorienteeritud programmeerimise põhiüksus on objekt, mis kapseldab nii seda kirjeldavaid andmeid (omadused) kui ka vahendeid nende andmete töötlemiseks (meetodid).
Kapseldamine on objekti omaduste ja sellega seotud võimalike operatsioonide (meetodite) liit.
Teine OOP-i aluseks olev põhimõte on võimalus luua uus objektide klass mõne juba olemasoleva klassi omaduste ja meetodite pärandusega.
Pärand on võime tuletada üks klass teisest, säilitades samal ajal kõik esivanemate klassi (eellase, mõnikord nimetatakse ka superklassiks) omadused ja meetodid ning lisades vajadusel uusi omadusi ja meetodeid.
Pärimise teel seotud klasside kogumit nimetatakse hierarhiaks. Pärand on mõeldud peegeldama sellist reaalse maailma omadust nagu hierarhia.
Teine OOP põhimõte on polümorfismi põhimõte.
Polümorfism on nähtus, mille puhul sama nimega funktsioon (meetod) vastab erinevale programmikoodile (polümorfsele koodile) sõltuvalt sellest, millise klassi objekti selle meetodi välja kutsumisel kasutatakse.
Polümorfism tagatakse esivanemaklassi meetodi realiseerimise muutmisega järglasklassis koos meetodi signatuuri kohustusliku säilitamisega. See tagab, et esivanema klassi liides jääb muutumatuks ja võimaldab koodis oleva meetodi nime seostada erinevate klassidega - millise klassi objektilt kutsutakse, sellest klassist võetakse etteantud nimega meetod. Seda mehhanismi nimetatakse dünaamiliseks (või hiliseks) linkimiseks – erinevalt staatilisest (varajasest) linkimisest, mis viiakse läbi kompileerimise ajal
Objektorienteeritud lähenemine võimaldab kombineerida staatilist mudelit, mis kirjeldab objekti omadusi ja dünaamilist mudelit, mis kirjeldab nende muutusi.
Selle lähenemise korral on ligipääs objekti omaduste muutmisele võimalik ainult sellele objektile kuuluvate meetodite kaudu. Meetodid "ümbritsevad" objekti omadusi; omadused on väidetavalt "kapseldatud" objektis.
Seega on objektorienteeritud programmeerimisel kesksel kohal objektid, mis ühendavad üheks tervikuks (kapseldavad) objekti omadused ja sellel võimalikud toimingud (meetodid).
Objektid, mis sisaldavad sama omaduste ja toimingute loendit, ühendatakse klassid. Iga üksik objekt on klassi näide. Klassi eksemplaridel võivad olla erinevad atribuutide väärtused.
Näiteks võib arvuti failisüsteem sisaldada sadu või tuhandeid faile. Kõigil failidel on sama atribuutide (nimi, asukoht failisüsteemis jne) ja toimingute (ümbernimetamine, teisaldamine või kopeerimine jne) komplekt ning need moodustavad objektide klassi Failid.
Iga üksik fail on selle klassi eksemplar ja sellel on spetsiifilised atribuutide väärtused (nimi, asukoht jne).
Tihti tuleb ette olukord, kus samu operatsioone saab teha erinevate klasside objektidega. Enamikku Windowsi keskkonna objektide klasse (kaustad, dokumendid, sümbolid jne) iseloomustab ka samade toimingute kogum (ümbernimetamine, teisaldamine, kopeerimine, kustutamine jne). See ühtlus on väga kasutajasõbralik.
Siiski on ilmne, et nende toimingute rakendamise mehhanismid ei ole erinevate klasside jaoks samad. Näiteks kausta kopeerimiseks peate tegema toimingute jada failisüsteemi muutmiseks ja sümboli kopeerimiseks dokumendis muudatusi tegema. Neid toiminguid teostavad erinevad programmid, mis on saadaval vastavalt Windowsi operatsioonisüsteemis ja Wordi tekstiredaktoris.
Sel viisil realiseeritakse polümorfism, need. võimalus teha samu toiminguid erinevatesse klassidesse kuuluvate objektidega, säilitades samas iga klassi jaoks individuaalsed meetodid nende rakendamiseks.
Moodustuvad objektid, millel on samad omaduste ja meetodite komplektid objektiklass. Niisiis, Wordi rakenduses on objektiklass dokument(Dokumendid), millel on järgmised omadused: Nimi(nimi), asukohtmine(FileNaine) jne. Selle klassi objektidel on ka teatud meetodite komplekt, näiteks: dokumendi avaminepolitseinik(Avatud) dokumentide printimine(Prindi välja), säilitaminedokument(Salvesta) jne.
Rakendustes olevad objektid moodustavad mingisuguse hierarhia. Objekti hierarhia ülaosas on rakendus(Rakendus). Seega sisaldab Wordi rakenduse objektide hierarhia järgmisi objekte: rakendus(rakendus), dokument(Dokumendid), dokumendi fragment(Valik), sümbol(Tegelane) jne.
Exceli rakenduse objektide hierarhia sisaldab järgmisi objekte. rakendus(rakendus), raamat(tööraamat), leht(Tööleht) rakuvahemik(vahemik), rakudka(Cell) jne.
Täielik viide objektile koosneb järjestikuste üksteise sees pesastatud objektide nimede seeriast. Selle seeria objektinimede eraldajad on punktid; seeria algab kõrgeima taseme rakenduse objektiga ja lõpeb meid huvitava objekti nimega. Näiteks Wordi dokumendi Пpo6a.doc link näeb välja selline:
Rakendus. Dokumendid("Ppo6a.doc")
Selleks, et objekt saaks sooritada mis tahes toimingut, tuleb määrata meetod. Paljudel meetoditel on argumendid, mis võimaldavad määrata tehtavate toimingute parameetreid. Argumentidele konkreetsete väärtuste määramiseks kasutatakse koolonit ja võrdusmärki ning argumendid eraldatakse komaga.
Visual Basicus iseloomustavad objekte mitte ainult omadused ja meetodid, vaid ka sündmused. Sündmus on tegevus, mille objekt tunneb ära. Sündmuse võib genereerida kasutaja (näiteks hiirenupu või klaviatuuri klahvi vajutamine) või see võib olla muude rakendusobjektide töö tulemus.
Iga sündmuse jaoks saate programmeerida vastuse, st objekti reaktsiooni toimunud sündmusele. Seda programmi nimetatakse sündmuse protseduur. Sündmusprotseduuri nimi koosneb tavaliselt objekti nimest ja sündmuse nimest. Näiteks nupuobjekti nimega Käsk1 ja sündmused Klõpsake("klõps", mis tekib, kui liigutame hiirekursori nupu pildi kohale ja vajutame hiire vasakut nuppu) sündmuse protseduur saab nime Käsk1_ Klõpsake.
Ürituse protseduuris võivad osaleda mitmed objektid. Näiteks ülalmainitud protseduuris Käsk1_ Klõpsake meeskond võib kohal olla
Tekst1. Tekst= "Tere!",
mille täitmise tulemusena "tekstiväljal" objekt nimega Tekst1 Ilmub rida sõnaga "Tere!".
Visuaalne programmeerimine, mille meetodeid kasutab arenduskeskkond Visual Basic, võimaldab luua graafilise liidese arendatud rakendustele, mis põhinevad juhtelementide kasutamisel, mille hulka kuuluvad nupud(CommandButton), märkeruudud(Märkeruut) , tekstiväljad(Tekstikast) liitkastid(ListBox) ja teised. Neid objekte, nende omadusi ja meetodeid käsitletakse järgmises jaotises. Praegu pange tähele, et kõige sagedamini kasutatakse juhtelemente kasutajalt andmete vastuvõtmiseks ja rakenduse tulemuste kuvamiseks. Seega on juhtnupud rakenduse kasutajaliidese ehitamise aluseks.
Peamised visuaalses programmeerimises kasutatavad objektid on vormid(Vorm). Vorm on aken, millele asetatakse juhtelemendid. Vorm on ka objekt, mida iseloomustab omaduste ja meetodite kogum. Nagu iga teise objekti puhul, saate vormile kirjutada näiteks sündmuse protseduuri Vorm_ Laadige, mis käivitatakse Laadi sündmuse toimumisel ja mille tulemusena täidetakse käivitatud rakenduse tööks vajalikud juhised.
kasutas sisuliselt ettekirjutava programmeerimise paradigmat – eesmärk oli luua kood, mis toimiks vastavalt andmetele. Selline lähenemine sobib hästi väikeste probleemide lahendamiseks, kuid tekitab loomisel palju lahendamatuid probleeme suured tarkvarasüsteemid.Üks alternatiividest direktiivne programmeerimine on objektorienteeritud programmeerimine, mis tõesti aitab toime tulla programmide mittelineaarselt kasvava keerukusega, kui nende maht suureneb. Siiski ei tohiks järeldada, et objektorienteeritud programmeerimise paradigma kasutamine tagab kõigi probleemide eduka lahenduse.
Programmeerimise professionaaliks saamiseks on vaja annet, loovust, intelligentsust, teadmisi, loogikat, oskust ehitada ja kasutada abstraktsioone ning mis kõige tähtsam – kogemusi.
Selles osas jätkame raamatu esimeses peatükis alustatud objektorienteeritud programmeerimise põhimõistete tutvustamist. Esiteks arutatakse erinevatele programmeerimiskeeltele ühiseid OOP-kontseptsioone ja seejärel nende rakendamist Java keeles.
Peaksite teadma, et objektorienteeritud programmeerimise kursust õpetatakse bakalaureuseõppe üliõpilastele terve semestri jooksul ja seetõttu on allpool esitatud materjal vaid väga lihtne sissejuhatus OOP maailma. Raamatus on palju täielikum käsitlus paljudest objektorienteeritud projekteerimise, projekteerimise ja programmeerimisega seotud probleemidest ning raamatu kolmandast peatükist leiate väga selge kirjelduse kõigist objektorienteeritud aspektidest. Java keel.
Objektorienteeritud programmeerimine või OOP (objektorienteeritud programmeerimine) - programmeerimismetoodika põhineb programmi kujutamisel objektide kogumina, millest igaüks on teatud tüüpi teostus, kasutades mehhanismi sõnumite edastamine aastal korraldatud klassid pärimishierarhia.
OOP keskne element on abstraktsioon. Andmed teisendatakse abstraktsiooni abil objektideks ja nende andmete töötlemise jada muutub nende objektide vahel edastatavateks sõnumiteks. Igal objektil on oma ainulaadne käitumine. Objekte võib käsitleda kui konkreetseid üksusi, mis vastavad sõnumitele, mis käsivad neil mõnda toimingut sooritada.
OOP-i iseloomustavad järgmised põhimõtted (vastavalt Alan Kayle):
Definitsioon 10.1. Abstraktsioon- probleemi lahendamise meetod, milles erinevat tüüpi objekte ühendab ühine mõiste (kontseptsioon) ja seejärel käsitletakse rühmitatud üksusi ühe kategooria elementidena.
Abstraktsioon võimaldab eraldada programmifragmendi loogilise tähenduse selle rakendamise probleemist, jagamisest väline kirjeldus objekti (liides) ja selle sisemine korraldus(rakendamine).
Definitsioon 10.2. Kapseldamine- tehnika, mille sisse peidetakse objekti liidese seisukohalt ebaoluline teave.
Definitsioon 10.3. Pärand- objektide omadus, mille kaudu klassi eksemplarid saavad juurdepääsu esivanemate klasside andmetele ja meetoditele neid uuesti määratlemata.
Pärimine võimaldab erinevatel andmetüüpidel jagada sama koodi, mille tulemuseks on väiksem kood ja suurem funktsionaalsus.
Definitsioon 10.4.
Üldine informatsioon
OOP on programmeerimisstiil, mis ilmus 20. sajandi 80ndatel. Erinevalt protseduurikeeltest, kus andmed ja nende töötlemise juhised eksisteerivad eraldi, on objektorienteeritud programmeerimisel see teave ühendatud üheks tervikuks.
OOP põhiprintsiibid
Pärand
Teine OOP-i põhimõte, pärimine, on ühe klassi võime kasutada teise klassi meetodeid, kordamata nende tegelikku rakendamist. Pärand võimaldab vabaneda lähtekoodi liiasusest.
Polümorfism
Teine OOP põhimõte on polümorfism. Selle kasutamine tähendab, et erineva keerukusastmega objektidega manipuleerimiseks saate luua ühe liidese, mis reageerib sündmustele erinevalt ja rakendab samal ajal õigesti määratud ülesandeid.
OOP keeled
OOP põhimõtteid kasutatakse kõige populaarsemates programmeerimiskeeltes nagu C++ ja Java, milles töötatakse välja märkimisväärne osa programmidest ja rakendustest. Samuti on vähem kasutatud OOP keeli - Delphi, Object Pascal, Ruby ja paljud teised.
OOP kriitika
Vaatamata valdavalt positiivsetele väidetele selle metoodika suhtes, kritiseeritakse OOP põhimõtteid sageli. Nagu OOP-il, on sellel omad puudused.
Esiteks ülemineku raskus. OOP-i põhimõtete mõistmine võtab üsna palju aega, eriti inimestel, kes töötavad tihedalt ainult protseduuriliste programmeerimiskeeltega.
Teiseks on puuduseks keerulisem dokumentatsioon, kuna on vaja kirjeldada mitte ainult klasse ja objekte, vaid ka nende rakendamise konkreetseid juhtumeid.Kolmandaks võib meetodite liigne universaalsus viia selleni, et lähtekood ja arendatud programmid on ülekoormatud funktsioonide ja võimalustega, mille järele antud juhul pole nõudlust. Lisaks märgivad nad ebaefektiivsust mälu eraldamise osas. Kuid hoolimata teiste arvamustest kasvab OOP programmeerijate arv pidevalt ja keeled ise arenevad kiiresti.
Tere! Kas olete kunagi mõelnud, miks Java on kujundatud nii, nagu see on? Selles mõttes, et lood klassid, nende põhjal - objektid, klassidel on meetodid jne. Aga miks on keele struktuur selline, et programmid koosnevad klassidest ja objektidest, mitte millestki muust? Miks oli kontseptsioon " objekt” ja asetada esiplaanile? Kas kõik keeled töötavad sel viisil ja kui ei, siis millist kasu see Javale annab? Nagu näha, siis küsimusi on palju :) Proovime tänases loengus vastata igaühele neist.
Näib, et Simul- programmeerimisstandardite järgi iidne keel, kuid nende "perekondlik" seos Javaga on palja silmaga nähtav. Tõenäoliselt saate hõlpsasti lugeda sellele kirjutatud koodi ja selgitada üldiselt, mida see teeb :) Begin Class Ristkülik (laius, kõrgus) ; tegelik laius, kõrgus; Alusta tegelikku ala, perimeetrit; protseduuri uuendamine; Algusala: = Laius * Kõrgus; OutText( "Ristkülikut värskendatakse, ala = ") ; OutFix(ala, 2, 8); OutImage; Ümbermõõt : = 2 * (laius + kõrgus) ; OutText( "Ristkülikut värskendatakse, perimeeter = ") ; OutFix(perimeeter, 2, 8); OutImage; Värskenduse lõpp; Värskenda; OutText("Loodud ristkülik: "); OutFix(laius, 2, 6); OutFix(kõrgus, 2, 6); OutImage; Ristküliku lõpp; Ristkülikuklass VärvilineRistkülik(värv); Teksti värv; Alusta OutText ( "Loodud värviline ristkülik, värv = ") ; Väljundtekst(värv); OutImage; Värvilise ristküliku lõpp; Ref(Ristkülik)Cr; Cr: - uus värviline ristkülik (10, 20, "roheline"); Lõpp; Koodinäide on võetud artiklist Simula - 50 aastat OOP-i. Nagu näha, ei erine Java ja selle esivanem üksteisest nii palju :) Seda põhjusel, et Simula ilmumine tähistas uue kontseptsiooni sündi - objektorienteeritud programmeerimine. Wikipedia annab OOP järgmise definitsiooni: Objektorienteeritud programmeerimine (OOP) - programmeerimismetoodika, mis põhineb programmi esitamisel objektide kogumina, millest igaüks on konkreetse klassi eksemplar ja klassid moodustavad pärimishierarhia. Minu arvates on see väga edukas. Hiljuti alustasite Java õppimist, kuid selles pole peaaegu ühtegi teile võõrast sõna :) Täna OOP- levinuim programmeerimismetoodika. Lisaks Javale kasutatakse neid paljudes populaarsetes keeltes, millest olete ehk kuulnud. Need on C++ (seda kasutavad aktiivselt arvutimängude arendajad), Objective-C ja Swift (nad kirjutavad programme Apple'i seadmetele), Python (kõige nõutum masinõppes), PHP (üks populaarsemaid veebiarenduskeeli), JavaScript (lihtsamalt öeldes, mida nad sellega ei tee) ja paljud teised. Mis on tegelikult need OOP-i "põhimõtted"? Räägime teile üksikasjalikumalt.
Tõenäoliselt on pooled vabadest töökohtadest (kui mitte rohkem) eeldavad teadmisi ja arusaamist OOP-st. Jah, see metoodika on kindlasti köitnud paljusid programmeerijaid! Tavaliselt tuleb OOP-i mõistmine kogemusega, kuna sellel teemal pole praktiliselt ühtegi sobivat ja juurdepääsetavat materjali. Ja isegi kui neid on, pole kaugeltki kindel, et lugejad nende otsa komistavad. Loodan, et suudan selle imelise metoodika põhimõtteid, nagu öeldakse, oma näppudel lahti seletada.
Niisiis, juba artikli alguses mainisin juba terminit "metoodika". Programmeerimisel kasutamisel tähendab see termin koodi korraldamise viiside komplekti olemasolu, selle kirjutamise meetodeid, millest kinni pidades saab programmeerija kirjutada täiesti kasutatavaid programme.
OOP (ehk objektorienteeritud programmeerimine) on programmikoodi korraldamise viis, kus programmi peamisteks ehitusplokkideks on objektid ja klassid ning programmi loogika on üles ehitatud nende koostoimele.
Objektide ja klasside kohta
Klass- see on andmestruktuur, mille saab koostada programmeerija ise. OOP terminites koosneb klass väljad(lihtsamalt öeldes - muutujad) ja meetodid(lihtsamalt öeldes - funktsioonid). Ja nagu selgus, annab andmete ja funktsioonide kombinatsioon sellega töötamiseks ühes struktuuris kujuteldamatu jõu. Objekt on klassi konkreetne eksemplar. Järgides klassi analoogiat andmestruktuuriga, on objekt spetsiifiline andmestruktuur, mille väljadele on määratud teatud väärtused. Lubage mul selgitada näitega:
Oletame, et peame kirjutama programmi, mis arvutab kolmnurga ümbermõõdu ja pindala, mille annavad kaks külge ja nendevaheline nurk. Sellise programmi kirjutamiseks OOP-i abil peame looma klassi (st struktuuri) kolmnurga. Klass Triangle salvestab kolm välja (kolm muutujat): külg A, külg B, nendevaheline nurk; ja kaks meetodit (kaks funktsiooni): arvutage ümbermõõt, arvutage pindala. Selle klassi abil saame kirjeldada mis tahes kolmnurka ning arvutada ümbermõõt ja pindala. Seega nimetatakse kindlat kolmnurka, millel on kindlad küljed ja nendevaheline nurk, klassi Triangle eksemplariks. Seega on klass mall ja eksemplar malli konkreetne teostus. Kuid eksemplarid on objektid, st konkreetsed elemendid, mis salvestavad konkreetseid väärtusi.
Üks levinumaid objektorienteeritud programmeerimiskeeli on java. Seal lihtsalt ei saa ilma esemeid kasutamata hakkama. Selline näeks välja selles keeles kolmnurka kirjeldava klassi kood:
/** * Kolmnurga klass. */ klass Kolmnurk ( /** * Spetsiaalne meetod, mida nimetatakse klassi konstruktoriks. * Võtab sisendiks kolm parameetrit: * külje A pikkus, külje B pikkus, * nurk nende külgede vahel (kraadides) */ Kolmnurk(kahekülgA, double poolB , topeltnurkAB) ( this.sideA = sideA; this.sideB = sideB; this.angleAB = nurkAB; ) double sideA; //Klassi väli, salvestab külje A väärtuse kirjeldatud kolmnurga topeltküljeleB; //Klassi väli , salvestab kirjeldatud kolmnurga topeltnurga AB külje B väärtuse; //Klassi väli salvestab kirjeldatud kolmnurga kahe külje vahelise nurga (kraadides) /** * Klassimeetod, mis arvutab kolmnurga pindala */ double getSquare() ( double ruut = see.külgA * see .külgB * Math.sin(this.angleAB * Math.PI / 180); return ruut; ) /** * Klassimeetod, mis arvutab kolmnurga ümbermõõdu */ double getPerimeter() ( double sideC = Math.sqrt(Math.pow (this.sideA, 2) + Math.pow(this.sideB, 2) - 2 * this.sideA * this.sideB * Math.cos(this. nurkAB * Math.PI / 180)); topeltperimeeter = see.külgA + see.külgB + külgC; tagasi perimeeter; ) )
Kui lisame klassi sisse järgmise koodi:
/** * Siin töötab programm */ public static void main(String args) ( //Väärtused 5, 17, 35 lähevad Triangle klassi konstruktorisse Triangle triangle1 = new Triangle(5, 17, 35 ); System.out .println("Kolmnurga 1 pindala: "+kolmnurk1.getRuut()); System.out.println("Kolmnurga 1 ümbermõõt: "+triangle1.getPerimeter()); //Väärtused 6 , 8, 60 minge Triangle klassi konstruktorisse Triangle triangle2 = new Triangle(6, 8, 60); System.out.println("Kolmnurga1 pindala: "+triangle2.getSquare()); System.out.println ("Kolmnurga 1 ümbermõõt: "+kolmnurk2.getPerimeter()); )
siis saab programmi juba käivitada. See on Java keele funktsioon. Kui klassis on selline meetod
Avalik staatiline tühimik (String args)
siis saab selle klassi käivitada. Vaatame koodi üksikasjalikumalt. Alustame joonest
Kolmnurk kolmnurk1 = uus kolmnurk(5, 17, 35);
Siin loome Triangle klassi triangle1 eksemplari ja anname sellele kohe külgede parameetrid ja nendevahelise nurga. Samal ajal kutsutakse välja spetsiaalne meetod, mida nimetatakse konstruktoriks ja mis täidab objekti väljad konstruktorile edastatud väärtustega. Kuidas on lood joontega?
System.out.println("Kolmnurga1 pindala: "+kolmnurk1.getRuut()); System.out.println("Kolmnurga 1 ümbermõõt: "+kolmnurk1.getPerimeter());
väljastage konsooli kolmnurga arvutatud pindala ja selle ümbermõõt.
Sama juhtub klassi kolmnurga teise eksemplariga.
Klasside olemuse ja betoonobjektide ehituse mõistmine on enesekindel esimene samm OOP metoodika mõistmiseks.
Taaskord kõige tähtsam:
OOP- see on viis programmikoodi korraldamiseks;
Klass- see on kohandatud andmestruktuur, mis koondab andmed ja funktsioonid nendega töötamiseks (klassiväljad ja klassimeetodid);
Objekt on klassi konkreetne eksemplar, mille väljadele on antud kindlad väärtused.
Kolm võlusõna
OOP sisaldab kolme peamist lähenemisviisi: pärimine, kapseldamine ja polümorfism. Alustuseks annan vikipeediast definitsioonid:
Kapseldamine on süsteemi atribuut, mis võimaldab teil klassis kombineerida andmeid ja nendega töötavaid meetodeid. Mõned keeled (nt C++) võrdsustavad kapseldamise peitmisega, kuid enamik (Smalltalk, Eiffel, OCaml) eristavad neid mõisteid.
Pärand on süsteemi atribuut, mis võimaldab kirjeldada uut klassi olemasoleva klassi põhjal, millel on osaliselt või täielikult laenatud funktsionaalsus. Klassi, millest pärand tuletatakse, nimetatakse baas-, vanem- või ülemklassiks. Uus klass on järeltulija, pärija, laps või tuletatud klass.
Polümorfism on süsteemi omadus, mis võimaldab kasutada sama liidesega objekte ilma teabeta objekti tüübi ja sisemise struktuuri kohta.
Mõista, mida kõik need määratlused tegelikult tähendavad, on üsna raske. Seda teemat käsitlevates erialaraamatutes pühendab iga määratlus sageli terve peatüki, kuid vähemalt lõigu. Kuigi selle olemust, mida programmeerija peab mõistma ja igaveseks oma ajju jäädvustama, on väga vähe.
Ja analüüsi näitena kasutame jooniseid tasapinnal. Kooligeomeetriast teame, et kõigi tasapinnal kirjeldatud kujundite puhul on võimalik arvutada ümbermõõt ja pindala. Näiteks punkti puhul on mõlemad parameetrid võrdsed nulliga. Segmendi jaoks saame arvutada ainult perimeetri. Ja ruudu, ristküliku või kolmnurga jaoks - mõlemad. Nüüd kirjeldame seda ülesannet OOP terminites. Samuti on kasulik hoomata arutlusahelat, mille tulemuseks on klassihierarhia, mis omakorda kehastub töökoodi. Mine:
Niisiis, punkt on väikseim geomeetriline kujund, mis on kõigi teiste konstruktsioonide (figuuride) aluseks. Seetõttu valiti punkt baasvanemaklassiks. Kirjutame Java keeles punktiklassi:
/** * Punktiklass. Põhiklass */ klass Point ( /** * Tühi konstruktor */ Point() () /** * Klassimeetod, mis arvutab kujundi pindala */ double getSquare() ( tagastab 0; ) /** * Klassimeetod, mis arvutab kujundi perimeetri */ double getPerimeter() ( return 0; ) /** * Klassi meetod, mis tagastab joonise kirjelduse */ String getDescription() ( tagastab "Punkt"; ) )
Saadud klassis Point on tühi konstruktor, kuna antud näites töötame ilma kindlate koordinaatideta ning töötame ainult parameetrite ja kõrvalväärtustega. Kuna punktil pole külgi, pole vaja sellele parameetreid edastada. Pange tähele ka seda, et klassis on pindala ja perimeetri arvutamiseks meetodid Point::getSquare() ja Point::getPerimeter(), mõlemad tagastavad 0. Punkti puhul on see loogiline.
Kuna meie punkt on kõigi teiste kujundite aluseks, siis pärime nende teiste kujundite klassid klassist Point. Kirjeldame punkti klassist päritud segmendi klassi:
/** * Class Line Segment */ class LineSegment pikendab punkti ( LineSegment(double segmentLength) ( this.segmentLength = segmentLength; ) double segmentLength; // Joone pikkus /** * Alistatud klassi meetod, mis arvutab rida */ double getSquare( ) ( return 0; ) /** * Alistatud klassimeetod, mis arvutab segmendi perimeetri */ double getPerimeter() ( tagastab this.segmentLength; ) String getDescription() ( tagastab "Segmendi pikkus: " + see.segmendi pikkus; ) )
Klassi joonsegment laiendab punkti
tähendab, et klass LineSegment pärib klassist Point. Meetodid LineSegment::getSquare() ja LineSegment::getPerimeter() alistavad vastavad baasklassi meetodid. Segmendi pindala on alati null ja perimeetri pindala on võrdne selle segmendi pikkusega.
Nüüd kirjeldame sarnaselt segmendiklassiga kolmnurga klassi (mis pärib samuti punktiklassist):
/** * Kolmnurga klass. */ klass Kolmnurk pikendab punkti ( /** * Klassi konstruktor. Võtab sisendiks kolm parameetrit: * külje A pikkus, külje B pikkus, * nende külgede vaheline nurk (kraadides) */ Kolmnurk(kahekülg A, kahekülg B, topeltnurkAB ) ( this.sideA = sideA; this.sideB = sideB; this.angleAB = nurkAB; ) double sideA; //Klassi väli, salvestab külje A väärtuse kirjeldatud kolmnurga topeltküljeleB; //Klassi väli, salvestab külje B väärtus kirjeldatud kolmnurga kolmnurga topeltnurkAB; //Klassi väli, mis salvestab kirjeldatud kolmnurga kahe külje vahelise nurga (kraadides) /** * Klassimeetod, mis arvutab kolmnurga pindala */ double getSquare() ( topeltruut = (this.sideA * this.sideB * Math.sin(this.angleAB * Math.PI / 180))/2; return ruut; ) /** * Klassimeetod, mis arvutab a perimeetri kolmnurk */ double getPerimeter() ( double sideC = Math.sqrt(Math. pow(this.sideA, 2) + Math.pow(this.sideB, 2) - 2 * this.sideA * this.sideB * Math.cos (this.angleAB * Math.PI / 180)); topeltperimeeter = see.külgA + see.külgB + külgC; tagasi perimeeter; ) String getDescription() ( tagastab "Kolmnurk külgedega: " + see.külgA + ", " + see.külgB + " ja nendevaheline nurk: " + see.nurkAB; ) )
Siin pole midagi uut. Samuti alistavad meetodid Triangle::getSquare() ja Triangle::getPerimeter() põhiklassi vastavad meetodid.
Noh, tegelikult on see kood, mis näitab polümorfismi maagiat ja paljastab OOP-i võimsuse:
Class Main ( /** * Siin töötab programm */ public static void main(String args) ( //ArrayList – see on spetsiaalne java andmestruktuur // mis võimaldab salvestada teatud tüüpi objekte array. ArrayList figures = new ArrayList (); //lisada joonistele kolm erinevat objekti array figures.add(new Point()); figures.add(new LineSegment(133)); figures.add(new Triangle(10, 17, 55)); jaoks ( int i = 0;i
Oleme loonud massiivi punkti klassi objektidest ja kuna klassid LineSegment ja Triangle pärivad klassist Point, saame need sellesse massiivi paigutada. Selgub, et igat joonist, mis on jooniste massiivis, võime käsitleda klassi Point objektina. See on polümorfism: pole teada, millisesse klassi jooniste massiivi objektid kuuluvad, kuid kuna kõik selle massiivi objektid kuuluvad samasse baasklassi Point, siis on rakendatavad ka kõik meetodid, mis on rakendatavad klassis Point oma järeltulijate klassidele.
Nüüd kapseldamisest. See, et panime joonise parameetrid ning pindala ja perimeetri arvutamise meetodid ühte klassi, on kapseldamine, me kapseldasime arvud eraldi klassidesse. See, et me kasutame klassis perimeetri arvutamiseks spetsiaalset meetodit, on kapseldamine, perimeetri arvutamise kapseldasime getPerimiter() meetodisse. Teisisõnu, kapseldamine varjab teostust (võib-olla kapseldamise lühim ja samal ajal mahukas definitsioon).
Täielik näidiskood:
Impordi java.util.ArrayList; class Main ( /** * Siin töötab programm */ public static void main(String args) ( //ArrayList on spetsiaalne andmestruktuur Javas // mis võimaldab salvestada kindlat tüüpi objekte massiivi. ArrayList figures = new ArrayList (); //lisada joonistele kolm erinevat objekti array figures.add(new Point()); figures.add(new LineSegment(133)); figures.add(new Triangle(10, 17, 55)); jaoks ( int i = 0;i