Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Polimorfizm, Problem z wywoałniem metody swojej klasy
morris4life
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


Witam,
mam taki kod:

  1. <?php
  2. class MyClass extends DOMNode{
  3. function Hello(){
  4. return '<b>Hello! World.</b>';
  5. }
  6. }
  7.  
  8. $doc = new DOMDocument();
  9. $doc->load('test.xml');
  10. $NodeList = $doc->getElementsByTagName('test');
  11.  
  12. $Node = new MyClass();
  13. echo $Node->Hello();
  14. $Node = $NodeList->item(0);
  15.  
  16. echo $Node->nodeValue;
  17. echo $Node->Hello();
  18. ?>


Wszystko jest ok aż do ostatniej linijki kodu - echo $Node->Hello();
Wynik skryptu:

Hello! World. test1
Fatal error: Call to undefined method DOMElement::Hello() in D:\WebServ\httpd-users\test\index.php on line 17

Czy istnieje jakieś rozwiązanie aby obiekt $Node = new MyClass() po przypisaniu $NodeList->item(0); był nadal obiektem klasy MyClass? questionmark.gif ?

Przez to cała robota mi stanęła...proszę o pomoc smile.gif

Ten post edytował morris4life 30.11.2009, 11:31:00
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
nospor
post
Post #2





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




Chyba nie czaisz jak działa dziedzicznie.
class MyClass extends DOMNode powoduje, ze klasa MyClass dziedziczy po klasie DOMNode a nie na odwrót

TO dziala:
  1.  
  2. $Node = new MyClass();
  3. echo $Node->Hello();

Gdyż $node to obiekt klasy MyClass

To nie dziala
  1. $Node = $NodeList->item(0);
  2. echo $Node->Hello();

Gdyż $node to obiekt klasy DOM i nie ma nic wspólnego z MyClass


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

"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
morris4life
post
Post #3





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


nospor
"Gdyż $node to obiekt klasy DOM i nie ma nic wspólnego z MyClass"

no to chyba nie całkiem do końca jest tak jak piszesz, ponieważ
  1. $Node = $NodeList->item(0);

jest właśnie klasy DOMNode

a moja MyClass to faktycznie rozszerzona klasa DOMNode.

temat nadal otwarty
[font="Tahoma"][/font]
Go to the top of the page
+Quote Post
nospor
post
Post #4





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




Cytat
nospor
"Gdyż $node to obiekt klasy DOM i nie ma nic wspólnego z MyClass"

no to chyba nie całkiem do końca jest tak jak piszesz, ponieważ
[PHP] pobierz, plaintext
$Node = $NodeList->item(0);

jest właśnie klasy DOMNode
Pokazany palcem a ten nadal nie kuma....

Cytat
jest właśnie klasy DOMNode
No wlasnie, jest klasy DOMNode i nie ma nic wspolnego z MyClass!
To MyClass dziedziczy po DOMNode a nie na odwrót. Jak masz coś co jest DOMNode to to cos nie ma dostępu do MyClass.
Jak masz cos co jest MyClass to ma to dostęp do DOMNode, gdyż MyClass dziedziczy po DOMNode.


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

"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
morris4life
post
Post #5





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


ok nie zrozumiałem .. zwracam honor biggrin.gif

czyli nie da rady zrobić tego tak jak np w Delphi, gdzie mogę sobie zadeklarować w funkcji zmienną var Node = TMyClass, potem podstawić pod nią wynik jakiejś funkcji, która zwraca wynik typu DOMNode i nadal odwoływać się do metod Node typu TMyClass?
Go to the top of the page
+Quote Post
Zyx
post
Post #6





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

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


morris4life -> to, że sobie rozszerzysz jakąś klasę, nie znaczy, że wszystkie jej obiekty automatycznie stają się od razu dziećmi tej klasy. I nawiasem mówiąc, gdzie tu masz jakiś polimorfizm?

Kod
class a {  /* jakiś kod */ }
class b extends a { /* jakiś kod */ public method foo(){ } }

$foo = new b; // obiekt klasy B dziedziczącej po A
$foo->foo();   // zadziała, bo to obiekt klasy B

$bar = new a; // obiekt klasy A
$bar->foo();   // nie zadziała, bo to obiekt klasy A


Jeśli DOMDocument tworzy obiekty DOMNode, to są to obiekty DOMNode i koniec, kropka, a nie żadne MyClass. Na koniec zagwozdka dla Twojego sposobu myślenia:

Kod
class ClassA extends DOMNode { }
class ClassB extends DOMNode { }

// i niby czym teraz miałyby być Twoje obiekty, gdyby było prawdą to, co piszesz?


Natomiast sytuacja, o której piszesz w Delphi jest karygodna! Jeśli stworzyłeś jakiś obiekt WYŁĄCZNIE jako obiekt klasy A, to NIE WOLNO go używać jako obiektu klasy B, nawet jeśli ona dziedziczy po A! A co, gdyby klasa B miała jakieś dodatkowe pola? Z obiektem wiąże się przecież pewien obszar pamięci. Na obiekty klasy A przewidziane jest 50 bajtów, na obiekty B - 80 bajtów. Teraz rzutujesz obiekt klasy A na "B", odwołujesz się do dodatkowego pola i co? Wychodzisz poza pamięć przyznaną obiektowi... gratulacje.

Ten post edytował Zyx 30.11.2009, 12:03:58


--------------------
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
morris4life
post
Post #7





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


przecież jeżeli:
  1. class MyClass extends DOMNode{
  2. function Hello();
  3. }
  4.  
  5. $Node = new MyClass();


to poprzez $Node mogę odwołać się zarówno do metod klasy MyClass oraz DOMNode np nodeValue - czy się mylę?
oraz dlaczego przypisanie
  1. $Node = $NodeList->item(0)

ma zamienić $Node w DOMNode, a nie pozostanie MyClass - przecież ja tu nie wywołuję kontruktora żadnej klasy?
W PHP dopiero raczkuję dlatego proszę o wyjaśnienie?
Go to the top of the page
+Quote Post
phpion
post
Post #8





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




Konstruktory dziedziczą się samoczynnie. Deklarujesz go tylko wówczas, kiedy chcesz dopisać nowy kod do konstruktora.
Go to the top of the page
+Quote Post
morris4life
post
Post #9





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


Cytat(Zyx @ 30.11.2009, 12:00:01 ) *
Natomiast sytuacja, o której piszesz w Delphi jest karygodna! Jeśli stworzyłeś jakiś obiekt WYŁĄCZNIE jako obiekt klasy A, to NIE WOLNO go używać jako obiektu klasy B, nawet jeśli ona dziedziczy po A! A co, gdyby klasa B miała jakieś dodatkowe pola? Z obiektem wiąże się przecież pewien obszar pamięci. Na obiekty klasy A przewidziane jest 50 bajtów, na obiekty B - 80 bajtów. Teraz rzutujesz obiekt klasy A na "B", odwołujesz się do dodatkowego pola i co? Wychodzisz poza pamięć przyznaną obiektowi... gratulacje.


Przecież nie można rzutować klasy A na klasę B ponieważ dostaniesz AV (A nie dziedziczy z B ) - co najwyżej B możesz rzutować na A ponieważ to B dziedziczy z A!

Co do odpowiedzi phpion to jest oczywiste, ale czy jest jakiś sposób aby przypisać właściwości obiektu A do B ale nie zamieniając A w B tylko niech pozostanie A?

Ten post edytował morris4life 30.11.2009, 12:29:57
Go to the top of the page
+Quote Post
darko
post
Post #10





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Cytat
czy jest jakiś sposób aby przypisać właściwości obiektu A do B ale nie zamieniając A w B tylko niech pozostanie A?


Kompozycja, można w klasie B zawrzeć obiekt klasy A, np.

  1. class B {
  2. protected $from_A;
  3. function __construct() {
  4. include_once 'A.class.php';
  5. $this->from_A = new A();
  6. }
  7. }
  8.  


Ten post edytował darko 30.11.2009, 12:36:58


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
morris4life
post
Post #11





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


Cytat(darko @ 30.11.2009, 12:29:54 ) *
Można w klasie B agregować obiekt klasy A, np.


czyli że jezeli bedę chciał aby
  1. B dziedziczyło z A
  2. C dziedziczyło z B
  3. itd aż do Z

to w klasie Z będę musiał agregować wszystkie poprzednie klasy żeby mieć dostęp do ich metod?

Ten post edytował morris4life 30.11.2009, 12:39:41
Go to the top of the page
+Quote Post
darko
post
Post #12





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Nie wiem czy dobrze Cię rozumiem: używasz kompozycji dla tylko jednej klasy, najbardziej wyprowadzonej (klasa Z), która dziedziczy metody z klas nadrzędnych.

Ten post edytował darko 30.11.2009, 12:42:19


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
morris4life
post
Post #13





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 31.05.2008

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


Cytat(darko @ 30.11.2009, 12:41:50 ) *
Nie wiem czy dobrze Cię rozumiem: używasz kompozycji dla tylko jednej klasy, najbardziej wyprowadzonej (klasa Z), która dziedziczy metody z klas nadrzędnych.


jeżeli B dziedziczy z A i A to klasa nadrzędna - to tak. O taka kompozycję mi chodzi.
Go to the top of the page
+Quote Post

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: 22.08.2025 - 04:03