Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][OOP] wielokrotne dziedziczenie, pytanie natury projektowo-filozoficzno-dywagacyjnej
Kedan
post
Post #1





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 20.07.2007

Ostrzeżenie: (0%)
-----


Mam zależność tego typu:
  1. <?php
  2. class myObject{
  3.    //...
  4. }
  5.  
  6. class myModule extends myObject {
  7.    //....
  8. }
  9.  
  10. class myModuleExt extends myModule {
  11.    //....
  12. }
  13. ?>


ale do tego mam zależność:
  1. <?php
  2. class myConcreteModule extends myModule {
  3.    //...
  4. }
  5.  
  6. // i tu pojawia się problem
  7. class myConcreteModuleExt extends myModuleExt, myConcreteModule {
  8.    //...
  9. }
  10. ?>


Od jakiegoś czasu główkuję jak to rozwiązać, ale nic sensownego nie przychodzi mi do głowy.

Ten post edytował Kedan 11.05.2009, 11:29:35
Go to the top of the page
+Quote Post
3 Stron V   1 2 3 >  
Start new topic
Odpowiedzi (1 - 19)
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




  1. <?php
  2. class myConcreteModule extends myModuleExt {
  3.   //...
  4. }
  5.  
  6. class myConcreteModuleExt extends myConcreteModule {
  7.   //...
  8. }
  9. ?>

questionmark.gif
Go to the top of the page
+Quote Post
Kedan
post
Post #3





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 20.07.2007

Ostrzeżenie: (0%)
-----


Nie o to chodzi.
myConcreteModule ma posiadać tylko i wyłącznie bazową funkcjonalność (myModule) + jakąś własną - unikalną.
myConcreteModuleExt ma posiadać funkcjonalność rozszerzoną (myModuleExt + myModule). unikalną bazową (myConcreteModule) i dodawać własną unikalną rozszerzoną.

Trochę to zakręcone, ale mam nadzieję że sa się to przeprojektować żeby wyglądało sensownie.

Od razu uprzedzam ludzi piszących o interfejsach: nic mi po nich, bo nie mam zamiaru przy każdej klasie definiować wszystkich metod na nowo.
Go to the top of the page
+Quote Post
marcio
post
Post #4





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


A klasy abstrakcyjne mozesz uzyc jak interfejsy tylko ze mozesz odrazu implementowac w niej metody.


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
batman
post
Post #5





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Cytat(marcio @ 11.05.2009, 13:29:42 ) *
A klasy abstrakcyjne mozesz uzyc jak interfejsy tylko ze mozesz odrazu implementowac w niej metody.

Nie może, ponieważ występuje ten sam problem co z klasami nieabstrakcyjnymi - nie można dziedziczyć po więcej niż jednej klasie.

~Kedan
Niestety w PHP nie ma rozwiązania Twojego problemu. Pozostaje Ci zmiana założeń lub kombinowanie z przekazywaniem pomocniczego obiektu między klasami.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
Kedan
post
Post #6





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 20.07.2007

Ostrzeżenie: (0%)
-----


Ostatecznie wymyśliłem coś takiego:
  1. <?php
  2. class myObj{}
  3. class myModule extends myObj{
  4.    public function Foo(){
  5.        echo __METHOD__;
  6.    }
  7.    public function Bar(){
  8.        echo __METHOD__;
  9.    }
  10. }
  11. class myModuleEx extends myObj{
  12.    protected $_module;
  13.    function __construct(){
  14.        $this->_module = new myModule();
  15.    }
  16.    public function __call($name_,$args_=null){
  17.        if(!method_exists($this,$name_)&&(method_exists($this->_module,$name_))){
  18.            $this->_module->$name_($args_);
  19.        }
  20.    }
  21. }
  22. class myConcreteModule extends myModule{
  23.    public function Zip(){
  24.        echo __METHOD__;
  25.    }
  26. }
  27. class myConcreteModuleEx extends myModuleEx{
  28.    function __construct(){
  29.        $this->_module = new myConcreteModule();
  30.    }
  31.    public function Doo(){
  32.        echo __METHOD__;
  33.    }
  34. }
  35.  
  36. $c = new myConcreteModuleEx();
  37. $c->Zip();
  38. ?>

Niby działa, ale pewnie jeszcze parę warunków trzeba będzie dopisać i dopiero przetestować w boju.

Ten post edytował Kedan 11.05.2009, 15:21:42
Go to the top of the page
+Quote Post
okitoki
post
Post #7





Grupa: Zarejestrowani
Postów: 214
Pomógł: 18
Dołączył: 25.04.2009

Ostrzeżenie: (20%)
X----


takie bajerki to C++ nam serwuje

interface w php to porażka, nie wiem dlaczego, ale na kilka razy miałem z nimi problem, bo jakiś serwer chociaż miał PHP5 wywalał mi błędy na nich. przez swoją głupotę musiałem potem przerabiać wiele bibliotek, a dokładniej usuwać wszystkie informacje o interfejsach.

może wiecie dlaczego się tak mogło dziać


--------------------
Go to the top of the page
+Quote Post
Kedan
post
Post #8





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 20.07.2007

Ostrzeżenie: (0%)
-----


Cytat
takie bajerki to C++ nam serwuje

Wiem, tylko pewnie jeszcze troche czasu minie zanim bede serwisy w C++ pisał winksmiley.jpg

Co do interfejsów, może jak implementowałeś kilka w danej klasie to może zapomniałeś zdefiniować jakąś metodę. A jak jeszcze po tej klasie dziedziczyłeś to już w ogóle kiszka. IMO interfejsy są ogólnie be. Tak jak singletony tongue.gif
Go to the top of the page
+Quote Post
okitoki
post
Post #9





Grupa: Zarejestrowani
Postów: 214
Pomógł: 18
Dołączył: 25.04.2009

Ostrzeżenie: (20%)
X----


Cytat(Kedan @ 11.05.2009, 16:48:26 ) *
Wiem, tylko pewnie jeszcze troche czasu minie zanim bede serwisy w C++ pisał winksmiley.jpg

Co do interfejsów, może jak implementowałeś kilka w danej klasie to może zapomniałeś zdefiniować jakąś metodę. A jak jeszcze po tej klasie dziedziczyłeś to już w ogóle kiszka. IMO interfejsy są ogólnie be. Tak jak singletony tongue.gif


właśnie nie bo by mi to nie działało, pisałem dość wielki projekt dla bigstara i tam właśnie się z tym spotkałem, ja wtedy u siebie na kompie miałem zainstalowany taki gotowiec, serwer krasnala, i właśnie mi wszystko hulało, jak to przegrałem na wewnętrzny serwer w BS to wszystko padło, i to na błędach krytycznych. jak usunąłem cały wpis o interfejsach to zaczęło działać, aha. O metodę krzyczał, a tam mu się sama deklaracja interfejsu nie podobała.


--------------------
Go to the top of the page
+Quote Post
Zyx
post
Post #10





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Żeby próbować odpalać interfejsy na PHP4 i złościć się, że nie działają, to trzeba być naprawdę zdolnym... jak Ci niby mają zadziałać, jak PHP4 ich nie obsługuje? Inerfejsy od wielu lat świetnie się mają chociażby w Javie, skąd zostały żywcem zerżnięte do PHP. Wykorzystuje je wiele projektów i jakoś nikt nie narzeka.

Wielokrotne dziedziczenie jest dość niebezpieczne z kilku powodów. Po pierwsze, nie oddziela implementacji od publicznego interfejsu - da się przez to stworzyć hierarchię klas, gdzie zmiana implementacji może wymuszać zmianę interfejsu lub zmuszać do nieprawidłowego użycia obiektów. Innymi słowy, trzeba znać bardzo dobrze wewnętrzne mechanizmy języka i przestrzegać ściśle dyscypliny. Kolejny mój zarzut przeciwko wielokrotnemu dziedziczeniu to sprawianie złudnego wrażenia, że jest ono potrzebne, podczas gdy sytuacje takie są baaaaaaaardzo rzadkie i w większości wynikają po prostu z popełnionych błędów projektowych. Nie bez powodu w Javie nie zdecydowano się na wprowadzenie czegoś takiego.

Kedan -> Twój problem może być bez trudu rozwiązany np. przez użycie kompozycji, albo przemyślenie, czy naprawdę musi to być w ten sposób właśnie robione... dokładną decyzję musisz podjąć sam, ponieważ to jest Twój kod i powinieneś najlepiej wiedzieć, co on ma odzwierciedlać. Przemyśl to, co napisałem. Tysiące, jeśli nie dziesiątki tysięcy projektów doskonale sobie bez wielokrotnego dziedziczenia radzą i mają się świetnie.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
Spawnm
post
Post #11





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




warto imho przyjrzeć się :: , czyli klasa::funkcja() bez dziedziczenia smile.gif
Go to the top of the page
+Quote Post
okitoki
post
Post #12





Grupa: Zarejestrowani
Postów: 214
Pomógł: 18
Dołączył: 25.04.2009

Ostrzeżenie: (20%)
X----


Cytat(Zyx @ 11.05.2009, 21:35:43 ) *
Żeby próbować odpalać interfejsy na PHP4 i złościć się, że nie działają, to trzeba być naprawdę zdolnym... jak Ci niby mają zadziałać, jak PHP4 ich nie obsługuje? Inerfejsy od wielu lat świetnie się mają chociażby w Javie, skąd zostały żywcem zerżnięte do PHP. Wykorzystuje je wiele projektów i jakoś nikt nie narzeka.



oj zyx może tobie kupili peceta teraz na urodziny, a ja niestety nie programuje od wczoraj. na php4 ten projekt by poszedł dopiero po totalnej przeróbce gdyż był cały napisany w OOP. A jak piszesz takie bzdury, to znaczy że ty w ogóle nie wiesz jak wyglądała obiektowość w PHP4, a raczej jej zarys, bo do obiektowości jej sporo brakowało.


--------------------
Go to the top of the page
+Quote Post
Zyx
post
Post #13





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Cytat
O metodę krzyczał, a tam mu się sama deklaracja interfejsu nie podobała.


Deklaracja działającego w jednym miejscu interfejsu może się nie podobać tylko i wyłącznie PHP4 oraz starszym. To, że projekt był w obiektówce, jeszcze nie jest wyznacznikiem, że był pisany pod PHP5. Wprawdzie obiektówka była w czwórce marna, ale była i się z niej chcąc nie chcąc korzystało. Powtarzam: mnóstwo projektów sobie znakomicie z interfejsami radzi i jakoś bugtrackera PHP nie zalewa fala żalu o tym, jak to się kod działający na jednym serwerze totalnie sypie na innym.

A wycieczki personalne możesz sobie darować, chyba że bardzo lubisz bliskie spotkania trzeciego stopnia z moderatorami.

Ten post edytował Zyx 11.05.2009, 22:37:32


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
Kedan
post
Post #14





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 20.07.2007

Ostrzeżenie: (0%)
-----


@Spawnm
Metody statyczne nie są złe, ale trochę nieeleganckie. Zazwyczaj stosuję je gdy potrzebuję coś "na szybko" albo gdy dana metoda jest tak podstawowa, że praktycznie każdy obiekt w systemie powinien ją posiadać (choć staram się tego unikać i kiedy mogę stosuję dziedziczenie);

@Zyx
No właśnie przy pomocy kompozycji rozwiązałem to w ostatnim kodzie jaki podałem smile.gif Myk tylko polega na tym, że obiekt sprawdza czy posiada daną metotę i jeśli nie - wywołuje metodę swojej składowej. Niestety możliwe jest to tylko dla metod publicznych, więc wszystkie metody chronione trzeba 'cofnąć' o jedno pokolenie wyżej - do myObj. W przypadku jaki podałem kazda z klas dodaje swoje trzy grosze do funkcjonalności; chodzi o ostateczne stworzenie obiektu posiadającego, w zależności od uprawnień, taki a nie inny zestaw metod, przy czym część z nich jest wszędzie taka sama, część ma być nadpisana a część całkowicie unikalna. Pewnie uda mi się jeszcze coś wyczarować z jakimś wzorcem projektowym, jakaś fabryka czy cuś...

Co do interfejsów - częściej mam potrzebę stosowania właśnie wielokrotnego dziedziczenia (takie mi zboczenie po C++ zostało) - jest to IMO o wiele bardziej naturalna 'droga' i OOP dużo traci rezygnując z tego rozwiązania. Wiem że jest mnóstwo projektów radzących sobie bez MI, ale pewnie tylko dlatego że nie ma innego wyjścia smile.gif (specyfika języka).

Ten post edytował Kedan 11.05.2009, 23:54:25
Go to the top of the page
+Quote Post
okitoki
post
Post #15





Grupa: Zarejestrowani
Postów: 214
Pomógł: 18
Dołączył: 25.04.2009

Ostrzeżenie: (20%)
X----


Cytat(Zyx @ 11.05.2009, 23:31:10 ) *
Deklaracja działającego w jednym miejscu interfejsu może się nie podobać tylko i wyłącznie PHP4 oraz starszym. To, że projekt był w obiektówce, jeszcze nie jest wyznacznikiem, że był pisany pod PHP5. Wprawdzie obiektówka była w czwórce marna, ale była i się z niej chcąc nie chcąc korzystało. Powtarzam: mnóstwo projektów sobie znakomicie z interfejsami radzi i jakoś bugtrackera PHP nie zalewa fala żalu o tym, jak to się kod działający na jednym serwerze totalnie sypie na innym.

A wycieczki personalne możesz sobie darować, chyba że bardzo lubisz bliskie spotkania trzeciego stopnia z moderatorami.



aż strach się bać tongue.gif


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@okitoki zyx jedynie napisał, ze w php4 nie bylo interfejsow. Moze ty i programujesz od kilku lat, ale z czytaniem ze zrozumieniem masz niesamowite problemy. Az strach sie bac jak ty czytasz specyfikacje projektow.

Cytat
aż strach się bać
Tego typu posty oraz wycieczki personalne nie są mile widziane na forum, wiec przystopuj.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
okitoki
post
Post #17





Grupa: Zarejestrowani
Postów: 214
Pomógł: 18
Dołączył: 25.04.2009

Ostrzeżenie: (20%)
X----


nie zupełnie, tak jak piszesz, bo stwierdził fakt że próbowałem to odpalić na PHP4, jak by tak było to bym nie pytał, co mogło być powodem, bo w PHP siedzę od wersji 3

Cytat(Zyx @ 11.05.2009, 21:35:43 ) *
Żeby próbować odpalać interfejsy na PHP4 i złościć się, że nie działają, to trzeba być naprawdę zdolnym... jak Ci niby mają zadziałać, jak PHP4 ich nie obsługuje? Inerfejsy od wielu lat świetnie się mają chociażby w Javie, skąd zostały żywcem zerżnięte do PHP. Wykorzystuje je wiele projektów i jakoś nikt nie narzeka.


--------------------
Go to the top of the page
+Quote Post
Spawnm
post
Post #18





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




skoro mowa o Wielodziedziczeniu , to mógł by mi ktoś powiedzieć jak się je robi za pomocą interfejsu ?
bo na phpedi pisze że można smile.gif
Go to the top of the page
+Quote Post
marcio
post
Post #19





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Chodzi chyba o to ze np w jakies klasie mozesz uzyc 1 lub wiecej interfejsow potem np po tej klasie dziedziczysz i mozesz sobie dodac nowe interjesy poprostu slowo implements nie ma ograniczen jak extends ze jesli damy wiecej niz 1 interfejs nie zadziala, tak mi sie wydaje ze o to chodzi w praktyce nie wiem jak z tym jest tongue.gif


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
plurr
post
Post #20





Grupa: Zarejestrowani
Postów: 175
Pomógł: 12
Dołączył: 28.06.2007
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Cytat(Spawnm @ 12.05.2009, 18:14:01 ) *
skoro mowa o Wielodziedziczeniu , to mógł by mi ktoś powiedzieć jak się je robi za pomocą interfejsu ?
bo na phpedi pisze że można smile.gif


mozesz implementowac wiecej interfejsow, tym samym wymuszać na klasie pewne zachowania.
Listing na przykladize wzorca registry - http://athlan.pl/code/RegistryExtended

Jak sam autor tego listingu napisał, implementuje interfejsy:

"Iterator
ArrayAccess (na potrzeby poruszania się po instancji jak po tablicy)
Countable (aby łatwo otrzymać liczbę przechowywanych danych)
Serializable (żeby można było zaserializować i odserializować instancję obiektu)"


Ogolnie rzecz biorac, wiele osob twierdzi ze dziedziczenie jest zle, po pewnych doswiadczeniach rowniez ja zgadzam sie z ta opinia. dziedziczenie < kompozycja

http://art-of-software.blogspot.com/2008/0...-telefonie.html

Ten post edytował plurr 12.05.2009, 17:37:12


--------------------
Wyobraźnia bez wiedzy może stworzyć rzeczy piękne.
Wiedza bez wyobraźni najwyżej doskonałe.

Albert Einstein
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 18:13