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? (IMG:style_emoticons/default/questionmark.gif) ?

Przez to cała robota mi stanęła...proszę o pomoc (IMG:style_emoticons/default/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
Zyx
post
Post #2





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
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 26.12.2025 - 19:55