Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> EventDispatcher, przesłanianie metody addListener w dziedziczeniu
adbacz
post
Post #1





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

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


Mam klasę EventDispatcher, w której znajduje się metoda addListener:
  1. class EventDispatcher
  2. {
  3. private $listeners = array();
  4. public function addListener($name, EventListener $listener)
  5. {
  6. }
  7. }

I inną klasę, która ma podobne zadanie, tylko zmienia się ciało funkcji addListener oraz notify (zmienia się cało, nie jej parametry (nie wklejam jej tutaj, bo nie o to chodzi), dlatego potrzebuję klasy dziedziczącej po EventDispacher):
  1. class PluginEventDispatcher extends EventDispatcher
  2. {
  3. private $listeners = array();
  4. public function addListener($name, PluginEventListener $listener)
  5. {
  6. }
  7. }

No i dwa interfejsy:
  1. interface EventListener
  2. {
  3. // ...
  4. }
  5.  
  6. interface PluginEventListener
  7. {
  8. // ...
  9. }


Problem zaczyna się gdy odpalam skrypt. Wyrzuca mi info, że "Strict standards: Declaration of PluginEventDispatcher::addListener() should be compatible with that of EventDispatcher::addListener()". Wiem, że chodzi o metodę addListener i jej drugi parametr (inne nazwy interfejsów), ale myślałem, że gdy przesłania się metodę, to ta przesłaniana jest całkowicie nadpisywana przez przesłoniętą (a raczej na odwrót), a nie, że muszą być kompatybilne.

Jak rozwiązać problem typowiania innych interfejsów?


EDIT:
Już zamiast interfejsów próbowałem użyć klasy EventListener oraz PluginEventListener i dziedziczenia tych klas, ale niestety wyskakuje ten sam błąd. Można to jakoś inaczej rozwiązać?

Ten post edytował adbacz 20.08.2014, 16:06:45
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. Interfejs PluginEventListener powinien dziedziczyć po EventListener.
2. Nie pozostaje Ci chyba nic innego jak ręczne sprawdzanie przez instanceof czy przekazano odpowiedni parametr.
Go to the top of the page
+Quote Post
adbacz
post
Post #3





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

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


Interfejsy mogą po sobie dziedziczyć? Od kiedy?
Poza tym, nie uważasz, że gdyby dziedziczenie miało pomóc, to pomogło by po zmianie interfejsów na klasy?

EDIT:
Zwracam honor, faktycznie można dziedziczyć. Nie wiedziałem o tym. Zaraz to sprawdzę...

Ten post edytował adbacz 21.08.2014, 07:58:41
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
Interfejsy mogą po sobie dziedziczyć? Od kiedy?

http://pl1.php.net/manual/en/language.oop5.interfaces.php
Powód edycji: [nospor]:


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

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





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

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


Niestety, dziedziczenie interfejsów niewiele tu pomogło - nadal ten sam błąd jest.

No zostaje mi faktycznie, sprawdzenie ręcznie przez instanceof, ale czy można ten roblem rozwiązać w jakiś inny sposób? Czy ma może ktos jakiś pomysł? Płacę jak za prezydenta!
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: 20.08.2025 - 09:21