|
Tere, kas keegi viitsiks mulle php algajale seletada, mis on nende abstract classide mõte. kus neid kasutama peaks? |
|
Abstraktse klassi mõte on eemaldada "boilerplate" koodi ja "sundida" laiendavaid klasse kindlaid meetodeid implementeerima. Näiteks:
Koodis meil ei oleks mõtet teha Fruit objekti kuna me ei tea kuidas seda süüa. Me teame, et saame puuvilja süüa aga kuidas peab määrama konkreetne Puuvilja laiendus. Me ei saa küll objekti Puuvili tekitada aga me saame käsitleda iga Puuvilja laiendust (Õun ja Apelsin) käsitleda kui Puuvilja, sest me teame, et puuvilju on võimalik kuidagi süüa ja värvida seega ei pea täpselt teadma millise konkreetse Puuvilja laiendusega on tegu. 1
ehk siis abstact class panna sel juhul, kui sa ei soovi, et parent classi saab üksinda kasutada? ehk alati peab tegema class child extends parent?
(May 28 '10 at 09:57)
keevitaja
@keevitaja pmt jah ja jah. Teise puhul ei pea alati ise konkreetset klassi tegema, kui näiteks tegemist on Plugin liidese kirjeldus.
(May 29 '10 at 06:31)
egon ♦♦
|
|
Ümbersõnastades mis egon ütles: Ülemklass on mõistlik abstraktsena defineerida siis kui sellest konkreetsete objektide loomine ei oma mõtet. Mitmetes OOP keeltes abstraktse klassi mõiste puudub, ning nendes defineeritakse seda sorti ülemklasse tihtipeale nõndaviisi:
Abstraktsete klasside tugi keele poolt annab võimaluse teha sedasama natukene lihtsamalt ja vigu (nagu implementeerimata jäänud meetodid) juba enne programmi jooksutamist automaatselt tuvastada. aga kas siis abstrakses classis peab ära kirjeldame kõik funktsioonid mida child classis kasutada plaanin?
(May 28 '10 at 10:00)
keevitaja
@keevitaja ei pea kirjeldama. Kirjeldada võiks need meetodid, mis on puuviljadele omased. Näiteks apelsin koosneb sisemiselt "segmentidest" aga õun mitte, siis võib apelsinil olla mingi meetod getSegmentideArv(), mis õunal ei ole.
(May 28 '10 at 20:39)
egon ♦♦
|
|
Alustuseks tasub sul endale selgeks teha, et mis erinevus on klassi ja instantsi mõistetel. Esimene neist on eeskiri mäluobjekti koostamiseks ja teine on reaalne mäluobjekt, mis on koostatud klassikirjelduse põhjal. Hea lugemine antud teemal on http://download.oracle.com/javase/tutorial/java/concepts/ mis räägib objektorienteeritud lähemise sisulisest poolest, ilma milleta pole tehnilise külje mõistmine lihtsalt võimalik. Abstraktsete meetodite olemasolul on PHP-s kaks põhilist eesmärki:
Oletame, et sa kirjutad tarkvara, mis elab kusagil serveris ja kogub regulaarsete ajaintervallide järel andmeid, ütleme näiteks, Eesti automüügiportaalides sisalduvate kuulutuste kohta. Iga automüügiportaal pakub oma kuulutuste loetelu erinevas formaadis. Kirvemeetodil lähemine oleks see, et sa lihtsalt kirjutad iga portaali jaoks eraldi PHP skripti ja võib-olla ka mõned funktsioonid. Niisugusel lahendusel on mitmeid puuduseid: iga skripti eraldi kirjutamiseks kulub sul mõtetult palju tööaega, vigu tekib rohkem kuna koodiridu on rohkem ja tulevikus on niisuguse segaduse täiendamine paras peavalu. Mõtekam on alustuseks läbi mõelda, et milline on see funktsionaalsuse ühisosa kõigi automüügiportaalide loetelu tõmbamisel, parsimisel ja kohalikku andmebaasi salvestamisel. Ilmselt on kattuvateks osadeks tõmbamine ja kohalikku andmebaasi salvestamine. Parsemise loogika oleks meie näiteks iga autoportaali puhul erinev, kuna oma kuulutuste loetelu pakub igaüks erinevas formaadis. Nii saab kuulutuste importija vormistada abstraktse klassina, kus reaalselt implementeeritud funktsioonid sisaldavad tõmbamise ja kohalikku andmebaasi salvestamist, parsemise osa jäetakse esialgu abstraktseks. Iga konkreetse autoportaali jaoks extendid sa oma abstraktset klassi ja implementeerid ainult loetelu parsemise, sest tõmbamist ja andmebaasi salvestamist juhtiv kood on sul juba olemas. Ehk et võtmesõnadeks on korduvkasutuse lihtsustamine, aja kokkuhoid ja selgelt struktureeritud programm. |
