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.
abstract class Subject implements \SplSubject { //operacje wspólne dla wszystkich klas dziedziczących public function attach (SplObserver $observer) { // } public function detach (SplObserver $observer) { // } public function notify () { // } }
I klasę logowania dziedziczącą po subject.
class Login extends Subject { // autoryzacja etc. }
Dalej mam klasę obserwatora, ale chcę współpracować tylko z typem LoginObserver więc tworzę abstrakcyjną klasę.
abstract class LoginObserver implements SplObserver { //operacje wspólne dla wszystkich klas potomnych public function update (SplSubject $subject) { // TODO: Implement update() method. } }
I przykładową klasę.
class SendEmail extends LoginObserver { // wysyłanie email czy tam czegoś dla przykładu }
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ć.