Bedzie trudno opisac to co chce osiagnac, jednak mam nadzieje ze jakos zrozumiecie.
Tworze sobie kod, w ktorym potrzebuje miec 3 elementy:
- uzytkownik
- grupa uzytkownikow
- inny
Kazdy z tych elementow jest u mnie reprezentowany przez obiekt typu Type. Obiekty te moge tworzyc i kazdy z nich ma przechowywac i zwracac numer (uzytkownika, grupy lub inny).
W kodzie wyglada to nastepujaco:
<?php abstract class Type { private $number; public function setNumber($number){ $this->number = $number; } public function getNumber(){ return $this->number; } } class User extends Type { public function __construct($number){ $this->setNumber($number); } } class Group extends Type { public function __construct($number){ $this->setNumber($number); } } ?>
Obiekty typu Type wykorzystuje w obiekcie Context:
<?php class Context { private $type; $this->type = $type; } public function getNumber(){ return $this->type->getNumber(); } } ?>
Problem polega na tym, ze obiekt Other, typu Type oprocz numeru wymaga innego parametru, ktory musi byc wykorzystany rowniez w kontekscie Context i podany wraz z metoda getNumber:
<?php class Other extends Type { private $otherField; public function __construct($number, $otherField){ $this->setNumber($number); $this->setOtherField($otherField); } public function setOtherField($otherField){ $this->otherField = $otherField; } public function getOtherField(){ return $this->otherField; } } ?>
a w obiekcie Context, po dodaniu obiektu Type i wywolaniu metody getNumber potrzebuje w przypadku obiektu Other pobrac rowniez pole otherField (nazwa tego pola i funkcje beda zmienne w zaleznosci od obiektu typu Type). Moglbym co prawda zrobic na sztywno wykrywanie typu obiektu Type:
<?php class Context { //... public function getNumber(){ if($this->type instanceof Other){ $this->otherField = $this->type->getOtherField(); return $this->type->getNumber(); }else{ return $this->type->getNumber(); } } //... } ?>
i w przypadku typu Other wymusic pobieranie dodatkowego pola ale w przypadku kilkunastu innych obiektow typu Type lub wielu funkcji dzialajacych w zaleznosci od typu obiektu Type to bedzie malo elastyczne bo bede powielal instrukcje warunkowe itd. Raczej tworzenie kilku rodzin obiektu Context tez nie wchodzi w gre... Jak byscie to rozwiazali?
Myslalem, zeby w metodzie getNumber w klasie Context przekazywac wraz z wywolaniem metody getNumber klasy Type referencje do kontekstu i przekazac na barki obiektow Type zarzadzanie polami w kontekscie. Problem w tym, ze obiekty Type musialby wiedziec o obecnosci kontekstu a tego chce uniknac.