Представь объект дом. Есть у него как бы внутренние объекты которые не наследуют его. например провода, они ведь ни чего общего с домом не имеют. Но проводам нужна какая то информацию о доме, например где у него проложены кабель каналы. Что бы дать такую информацию проводам приходиться делать методы дающие эту информацию публичными. Проблема в том что объект человек который будет использовать объект дом видеть объект с кучей доступных ему публичных методов которые для него не предназначены, например та же инфра про кабель каналы. Это само собой плохо так как изначально планировалось, что у объекта дом будет гораздо меньше публичных методов и он будет, что-то вроде черного ящика, а не получается так как внутренним объектам нужна инфра и им не откуда ее получит кроме как через публичные методы дома. Что я делаю не так? Внутренними объектами здесь я называю экземпляры классов хранящихся внутри базового класса, но ни как не связанные с ним через наследования. В моем примере это провода, которые являются частью дома, но с другой стороны, ни имеет, ни какого отношения к дому.
Пример для наглядности Код (Text): class Home { private $wires; function __construct() { $this->wires[] = new Wire($this, 5); $this->wires[] = new Wire($this, 10); } public function check_length($length) { return ( ($length <= 7 ) ? TRUE : FALSE ); } } class Wire { function __construct($home, $length) { if ($home->check_length($length) === FALSE) { echo(" слишком длинный провод для этого дома "); }; } }
Спасибо tommyangelo за попутку помочь,но прочитав половину по ссылке я не узнал ни чего нового и просил так как не понятно как может это мне помочь. Дайте пожалуйста пояснение чем именно должна помочь мне эта ссылка.
ChAko По ссылке описаны методы организации зависимостей классов друг от друга. Не совсем понятно, что именно ты хочешь получить. По описанной задаче - имхо это дом должен "дергать" методы проводов, а не наоборот. Т.е. метод checkLength должен относиться не к дому, а к проводу. PHP: <? class Home { public function setWire(Wire $wire){} public function getWire(){} } $home->getWire()->checkLength($home->_someParametr); Таким образом класс wire совсем ничего не знает - то ли "провод" в доме проложили, то ли протянули на столбе. Он лишь умеет по какому-то параметру рассчитывать длину. Точно так же и дом - ты можешь проложить медные провода, алюминиевые или еще какие-то. Главное, что у них будет общий интерфейс с методом checkLength() Ну а дом при вызове checkLength() о своих внутренних свойствах естественно знает. Если не понятно - давай рассмотрим на реальном примере, а не на псевдокоде.
tommyangelo Так я и думал что checkLength будет не правильно интерпритирован. Здесь этот метод проверяет длинну кабель канала дома, для того что бы знать какой провод нужен. Тоесть метод checkLength неотемлемая часть дома и его нельзя ни будь вынести. Возмем например метод проверки многоквартирный дом или индивидуальный для того что бы решить какие провода использовать. Мне не хочеться приводить сложные примеры. Ну уж поверте что есть внутрение методы которые нельзя выносить из класса дом так как они его неотемлемая часть и их дергают классы не связанные с домом для того что бы работать с ним. А задача напомню для класса человек предоставить класс дом с минимумом публичных методов. На других форумах мне советовали сделать класс прослойку по шаблону Proxy. Не совсем то что я хотел но все же рабочий вариант.
ChAko опять же имхо - если возникают такие трудности, значит класс Дом слишком перегружен и его можно разбить на несколько более мелких классов.