logi sisse meist KKK

Tere,

kas keegi viitsiks mulle php algajale seletada, mis on nende abstract classide mõte. kus neid kasutama peaks?

küsitud May 28 '10 at 07:31

keevitaja's gravatar image

keevitaja
11223


Abstraktse klassi mõte on eemaldada "boilerplate" koodi ja "sundida" laiendavaid klasse kindlaid meetodeid implementeerima.

Näiteks:

abstract class Puuvili {
    private $värv;

    abstract public function söö()

    public function setVärv($c) {
        $this->värv = $c;
    }
}

class Õun extends Puuvili {
    public function söö() {
        print("Söön");
    }
}

class Apelsin extends Puuvili {
    public function söö() {
        print("Koorin");
        print("Söön");
    }
}

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.

link

vastatud May 28 '10 at 08:07

egon's gravatar image

egon ♦♦
771239

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:

class Puuvili {
    private $värv;

    public function söö() {
        throw "Not implemented";
    }

    public function setVärv($c) {
        $this->värv = $c;
    }
}

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.

link

vastatud May 28 '10 at 09:53

Rene%20Saarsoo's gravatar image

Rene Saarsoo ♦♦
1.1k101121

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:

  1. anda võimalus koodi tasandil kehtestada standard mingi laiema ülesande lahendamiseks

  2. muuta koodi korduvkasutus odavamaks; eeldusel, et klasside struktuur ja kasutusloogika on piisavalt läbi mõeldud.

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.

link

vastatud Sep 01 '10 at 16:40

user-197%20%28google%29's gravatar image

user-197 (google)
2314

edited Sep 02 '10 at 11:45

Sinu vastus
lülita eelvaade

Jälgi seda küsimust

By Email:

Pärast sisselogimist saad tellida muudatuse teavitusi siit

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *kaldkiri* või __kaldkiri__
  • **paks kiri** või __paks kiri__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • põhilised HTML märgendid on samuti toetatud

Pinu tööpakkumised

kõik pakkumised »

Küsimuse sildid:

×22
×5

küsitud: May 28 '10 at 07:31

nähtud: 3,789 korda

viimati uuendatud: Sep 02 '10 at 11:45

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee