Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] OOP Przysłonienie metody.
Fred1485
post 31.12.2015, 16:25:33
Post #1





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


Witam,

Próbuję rozwiązać problem, cały dzień myślę i nie mogę wymyślić.

Chcę napisać prosty system logowania oparty o obserwatorów (w oparciu o SPL).

Mam przykładowo klasę Subject.

  1. abstract class Subject implements \SplSubject
  2. {
  3. //operacje wspólne dla wszystkich klas dziedziczących
  4. public function attach (SplObserver $observer)
  5. {
  6. //
  7. }
  8.  
  9. public function detach (SplObserver $observer)
  10. {
  11. //
  12. }
  13.  
  14. public function notify ()
  15. {
  16. //
  17. }
  18. }


I klasę logowania dziedziczącą po subject.

  1. class Login extends Subject
  2. {
  3. // autoryzacja etc.
  4. }


Dalej mam klasę obserwatora, ale chcę współpracować tylko z typem LoginObserver więc tworzę abstrakcyjną klasę.

  1. abstract class LoginObserver implements SplObserver
  2. {
  3. //operacje wspólne dla wszystkich klas potomnych
  4.  
  5. public function update (SplSubject $subject)
  6. {
  7. // TODO: Implement update() method.
  8. }
  9. }


I przykładową klasę.

  1. class SendEmail extends LoginObserver
  2. {
  3. // wysyłanie email czy tam czegoś dla przykładu
  4. }


I teraz sedno sprawy, klasa Login ma współpracować tylko z obserwatorami typu LoginObserver stąd w klasie Login warto by nadpisać metodę attach i zmienić rzutowanie na LoginObserver, oczywiście taki sposób nie działa, bo w interfejsie jest rzutowanie na SplObserver. Jednak nie chciałbym tworzyć kolejnych metod i "zaśmiecać". Nie wiem czy jest jakieś wyjście z tej sytuacji. Nie mogę sobie wyobrazić jak to zrobić.


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
b4rt3kk
post 31.12.2015, 16:59:28
Post #2





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


A nie możesz utworzyć abstrakcyjnej klasy, dajmy na to User, po której będą dziedziczyć SplObserver oraz LoginObserver a w interfejsie dasz w definicji:

  1. public function attach (User $observer);


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
Fred1485
post 31.12.2015, 17:09:46
Post #3





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


Nie wiem czy rozumiem twoją wypowiedź, ale interfejsów SplSubject oraz SplObserver nie mogę ruszyć, bo są wbudowane w język PHP. Nadpisując definicję w klasie potomnej dostanę oczywiście fatal error.

__EDIT__

Pomyślałem, że niech będzie tak jak jest a w klasie bazowej w metodzie attach rozwiążę to za pomocą ReflectionClass i tyle.

Pytanie jeszcze jedno.

Czy tworzenie abstrakcyjnej klasy bazowej, np.

  1. abstract class LoginObserver implements Observer {}


Tylko w celu późniejszego wykorzystania do odczytania "tożsamości" obiektu (np w ReflectionClass metoda subclassof). Jest dobrą praktyką? Taka klasa będzie zupełnie pusta, używana jedynie jako "most" przy kompozycji w klasach.

Ten post edytował Fred1485 31.12.2015, 19:07:31


--------------------
  1. echo 'I was trying';
  2. die ();
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 Wersja Lo-Fi Aktualny czas: 14.05.2024 - 13:41