|
PHP PHP aplikacije, Smarty, PEAR |
|
Alati teme | Način prikaza |
03. 03. 2013. | #11 |
Super Moderator
Knowledge base
Datum učlanjenja: 02.10.2006
Lokacija: Niš
Poruke: 1.618
Hvala: 263
275 "Hvala" u 104 poruka
|
ja sam baš skoro imao slučaj kada je za malo cela klasa mogla biti abstraktna (govorim naravno o PHP-u).
no, ispalo je da imam par funkcija koje mogu da delim sa potklasama. trebao mi je dakle unikatan aplication interface - a potklase su bile tu jer su istu stvar implementirale preko dve različite PHP biblioteke - pa se kreirala potklasa u zavisnosti od toga koja je PHP biblioteka instalirana na sistemu. svaki drugi koncept (koji ne bi išao preko abstrakcije) bi bio koncepcijski loš. Poslednja izmena od Peca : 03. 03. 2013. u 17:43. |
03. 03. 2013. | #12 | |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
Citat:
Primer: Ti u PHP-u možeš da uradiš sledeće: Kôd:
class Duck{ function quack(){ echo "Quack\n";} function fly(){ echo "Flap, Flap\n";} } class Person{ function __construct($name){$this->name=$name;} function quack(){echo "{$this->name} walks in the forest and imitates ducks to draw them\n";} function fly(){ echo "{$this->name} takes an airplane\n";} } function QuackAndFly($obj){$obj->quack(); $obj->fly();} QuackAndFly(new Duck()); QuackAndFly(new Person("Jules Verne")); Dakle, interesuje me zašto je u PHP dodat feature koji je u statičkim jezicima tu samo kao nužno zlo, upravo zato što su statički? Nadam se da sam jasniji.
__________________
blog Poslednja izmena od jablan : 03. 03. 2013. u 18:52. |
|
03. 03. 2013. | #13 |
novi klan
Professional
Datum učlanjenja: 03.02.2007
Poruke: 326
Hvala: 43
427 "Hvala" u 50 poruka
|
Iskreno, nisam nikad na apstraktne klase gledao kao na mehanizam za puko zadovoljenje kompajlera u ovakvim slučajevima, već više kao na pogodnost koja omogućava da se konstrukt "implemetnts Interface, extends Base" svede na "extends AbstractBase".
A što se tiče tvog primera, ako se ne varam, ni u Javi ti ne treba apstraktna roditeljska klasa, tj. dovoljno je da ona postoji, ne mora da bude apstraktna, i to će da radi, i kompajler se neće buniti, sve dok obe klase koje je nasleđuju sadrže potrebne metode. A ako hoćeš da se zaštitiš od "zloupotreba" tipa prosleđivanje ovoj QuackAndFly() f-ji objekta koji nema neki od potrebnih metoda, e tu u jednačinu ubacuješ apstraktnu klasu, i tu onda nema veze da li je jezik statički ili dinamički, i za jedne i za druge važi isto - moraju da implementiraju sve metode...
__________________
We professional we dealin' with business |
03. 03. 2013. | #14 | |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
Citat:
Što se tiče primera, u Javi je neophodno da 1) postoji roditeljska klasa, i 2) da roditeljska klasa ima navedena dva metoda. Keyword abstract ti omogućava da te metode ne moraš da implementiraš (pišući prazne brejsove ili dižući exception), po cenu da samu parent klasu ne možeš da instanciraš. PHP i drugi dinamički jezici već imaju tu pogodnost da 1) ne moraš da imaš parent klasu, a ako baš hoćeš da je imaš, 2) ne moraš da navodiš neimplementirane metode i 3) možeš da sprečiš njeno instanciranje na druge načine koji ne zahtevaju dodatno bloatovanje ionako već punačke sintakse.
__________________
blog |
|
03. 03. 2013. | #15 |
novi klan
Professional
Datum učlanjenja: 03.02.2007
Poruke: 326
Hvala: 43
427 "Hvala" u 50 poruka
|
Pa šta znam, ja sam na to gledao kao na feature, kada imaš potrebu da za neku familiju odrediš zajedničku osnovu, a ne kao na bloat.
U tom slučaju jeste, ne mora da postoji, ali onda ne mora da postoji ni u statičkim jezicima, jer sve to može isto tako da se izvede upotrebom interfejsa, override-ovanja metoda, i nekom tehnikom za zabranu instanciranja.
__________________
We professional we dealin' with business |
04. 03. 2013. | #16 |
expert
Grand Master
Datum učlanjenja: 11.04.2010
Poruke: 998
Hvala: 141
959 "Hvala" u 153 poruka
|
@jablan
Kôd:
namespace Dpt; abstract class Database { protected $link; abstract public function query(string $query); } class Mysql extends Database { public function query(string $query) { return mysql_query($query, $this->link); } } class Pdo extends Database { public function query(string $query) { return $this->link->query($query); } } a.) zabraniti instanciranje? b.) forsirati implementiranje metoda? Kôd:
namespace Dpt; class Database { public function __construct() { trigger_error('Not allowed', E_USER_ERROR); } } class Mysql extends Database { public function __construct() { } function query() { var_dump(func_get_args()); } } (new \Dpt\Mysql)->query('Hello'); Tvoj mi primjer nije jasan, jesi li mislio na ovo: Kôd:
function QuackAndFly(Duck $obj){$obj->quack(); $obj->fly();} Poslednja izmena od webarto : 04. 03. 2013. u 01:37. |
04. 03. 2013. | #17 | |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
Citat:
Ono što mi nije jasno je šta ti njima dobijaš u dinamičkom jeziku. Obične parent klase bez deklarisanih metoda sasvim dobro rade posao, zar ne? @webarto: Upravo tako. S tim što je bacanje exceptiona u Database konstruktoru skroz opciono, jer ti praktično ništa ne dobijaš time, jedino pišeš kod za nekog morona koji bi probao da instancira Database klasu. U statičkim jezicima to opet ima smisla, jer će se greška pojaviti u compile timeu, tj. neće moći da se program iskompajlira ako neko napiše "new Database". U PHPu (ako se ne varam, ispravite me ako grešim), čak i da koristiš apstraktnu klasu, greška bi iskočila u runtimeu, tako da i ta prednost apstraktne klase koju imaš u Javi ovde ne postoji. Takođe je i sama svrha postojanja parent klase diskutabilna (u tvom primeru nema smisla, ali hajde da pretpostavimo da te dve klase zaista imaju neku zajedničku funkcionalnost). Sve u svemu, PHP i ostali dinamički jezici su praktično srećni zato što programer nema potrebu da piše puno koda samo da bi zadovoljio kompajler. Zato me čudi što se veštački dodaju featuresi iz statičkih jezika iako nemaju smisla i praktično ukidaju prednosti koje dinamički jezici imaju. To bi bilo kao da atletičar navuče bocu s kiseonikom od 10 kila pre trke samo zato što je video da ronioci to rade.
__________________
blog |
|
04. 03. 2013. | #18 | |
profesionalac
Professional
|
Citat:
PHP kôd:
PHP kôd:
Webarto je krenuo u pravom smeru. PHP kôd:
|
|
04. 03. 2013. | #19 | |
expert
Grand Master
Datum učlanjenja: 11.04.2010
Poruke: 998
Hvala: 141
959 "Hvala" u 153 poruka
|
@djuki
Ako je i jedna metoda abstract onda i klasa mora biti abstract, za to je izbacilo grešku a ne za ono što si mislio. Kôd:
abstract class Vizija { abstract function definisiViziju(); } class Birokratija extends Vizija { } Citat:
Poslednja izmena od webarto : 04. 03. 2013. u 13:53. |
|
04. 03. 2013. | #20 |
profesionalac
Professional
|
@webarto
U pravu si da mora biti abstraktna i klasa. Ipak važan je deo što jablan kaže da ne možemo "naterati" naslednike da implementiraju metode. Možemo naravno. Ovo što pišem radi u 5.2 verziji. PHP kôd:
PHP kôd:
|
|
|