Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Polimorfizm
Forum PHP.pl > Forum > PHP
morris4life
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
nospor
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
morris4life
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]
nospor
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.
morris4life
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?
Zyx
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.
morris4life
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?
phpion
Konstruktory dziedziczą się samoczynnie. Deklarujesz go tylko wówczas, kiedy chcesz dopisać nowy kod do konstruktora.
morris4life
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?
darko
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.  
morris4life
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?
darko
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.
morris4life
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.