Ale mam dwa pytania:
1. Domyślnie funkcje, tzn metody są domyślnie public. To, że właściwości mogą być np private jest dla mnie zrozumiałe. Ale czy jest sens tworzyć metodę private? Po co?
2. Nie mogę zrozumieć sensu istnienia interfejsu. Może w tej książce jest to beznadziejnie opisane ale sami zobaczcie. Autor pisze:
Cytat
(...)Mając uzgodniony zestaw metod, możemy sprawić, by zupełnie różne obiekty były przekazywane do tych samych funkcji bez potrzeby tworzenia między nimi relacji opartych na dziedziczeniu.(...)
i podaje taki przykład:
Plik interface.Openable.php
<?php interface Openable { abstract function open(); abstract function close(); } ?>
Plik class.Door.php
<?php require_once ('interface.Openable.php'); class Door implements Openable { private $_locked = false; public function open() { ... ... } public function close() { .. ... } public function lockDoor() { ... ... } public function unlockDoor() { ... ... } } ?>
Plik class.Jar.php
<?php require_once ('interface.Openable.php'); class Jar implements Openable { private $contents; public function __construct($contents) { $this->contents = $contents; } public function open() { ... ... } public function close() { .. ... } ?>
i wreszcie plik główny
testOpenable.php
<?php require_once ('class.Door.php'); require_once ('class.Jar.php'); function openSomething(Openable $obj) { $obj -> open(); } $objDoor = new Door(); $objJar = new Jar('galaretka'); openSomething($objDoor); openSomething($objJar); ?>
A następnie autor pisze:
Cytat
(...)Ponieważ zarówno klasa Door, jak i Jar implementują interfejs Openable, można przesłać obiekty każdej z tych klas do funkcji openSomething(). Ponieważ funcja ta akceptuje tylko coś, co implementuje interfejs Openable, wiemy, że możemy w jej ramach wywołać funkcję open() i close(). Nie należy jednak próbować dostępu do właściwości contents ani używać funkcji lock() lub unlock() z poziomu aplikacji funkcji openSomething(), ponieważ ta właściwość i te moetody nie są częścią interfejsu. (...)
Skoro możemy używać tylko tych metod, które zostały wymienione w interfejsie to po jakiego grzyba w klasach tworzył inne metody? Po co wogóle ten interfejs skor i tak powtarzamy kod. W klasie Door piszemy metodę open() i close() i w klasie Jar też piszemy. A w obiektowości chodzi m.in. o nie powielanie kodu (słowa autora).
Próbuje zrozumieć ten przykład, żeby nie mieć dalej problemów w następnych rozdziałąch, ale wydaje mi się to bez sensu.
Może mi to ktoś wytłumaczyć?