Autor | Zpráva | ||
---|---|---|---|
Wool Profil * |
#1 · Zasláno: 2. 7. 2009, 15:33:57
Přeju hezké odpoledne,
můj dotaz se váže na rozšiřování třídy pomocí class extends. Rád bych věděl, jestli je nějak možné za běhu aplikace udělat něco tohoto typu: Mám třídu dejme tomu Pozdravy definuju si podle ní proměnnou class Pozdravy { function ahoj(){ return 'Ahoj'; } } $output = new Pozdravy; Teď běží aplikace, nabalují se další soubory a najednou přijdu na to, že potřebuji přidat i specifické případy této třídy a tak si definuji proměnnou jako tento specifický případ class slusnePozdravy extends Pozdravy { function dobryDen(){ return 'Dobry den'; } } $output = new slusnePozdravy; Aplikace dál běží a najednou tu je další rozšíření. class jinePozdravy extends Pozdravy { function namazSi(){ return 'Namaz si drzku sadlem'; } } No a tady je můj problém. Rád bych tohle rozšíření přidal, ale pokud to jako v předchozím bloku přiřadím proměnné $output, tak ztratím funkci dobryDen(), což nechci, ale zároveň při psaní třídy nevím, jestli v tom konkrétním běhu aplikace se objeví i slusnePozdravy, takže nemohu použít class jinePozdravy extends slusnePozdravy. Existuje nějaké řešení jak docílit takového rozšíření? P.S.: Tenhle příklad berte s nadsázkou, realita je komplexnější, ale technicky to odpovídá. |
||
Časová prodleva: 3 dny
|
|||
Jan Tvrdík Profil |
#2 · Zasláno: 5. 7. 2009, 10:18:24
Wool:
Chápu to dobře, že si potřebuješ do třídy doplnit metodu, kterou nemá? V C# je na to tzv. Extension method. V PHP nic takového neexistuje. Nette Framework to řeší pomocí třídy Nette\Object, takže jestli chceš podobného efektu dosáhnout, tak si stáhni Nette a poděď si třídu od Nette\Object. |
||
Timy Profil |
#3 · Zasláno: 5. 7. 2009, 12:30:53
Wool
Pokud i v jinePozdravy potřebuješ zavolat dobryden(), tak máš špatně současný návrh. Pokud tu metodu dobryden() mají mít všichni potomci třídy Pozdravy, pak musí být metoda definována už v této třídě. Pokud ji mají mít jen některé třídy, pak by ty třídy měly mít nějakého dalšího rodiče – buď pomocí vícenásobné dědičnosti nebo pomocí rozhraní (interface). |
||
Časová prodleva: 15 let
|
0