Допустим есть объект, хотелось бы его в одни функции передавать с одним интерфейсом, а в другие с другим, т.е. чтобы в первой функции доступны были определенные первым интерфейсом методы, а в другой вторым интерфейсом, собственно вопрос, КАК ЭТО СДЕЛАТЬ?
С точки зрения концепции ООП такой подход неправильный. Реализуй общий объект, доступный всем, а потом сделай наследованные реализации для требуемых методов.
Apple Ты не понял суть, объект один и тот же, он должен содержать в себе все необходимые методы, просто подключаемым к нему объектам он должен быть доступен больше, чем пользователю скажем
Костян Вчитайся в вопрос, предположим есть класс, реализующий интерфейсы a и b, я хочу чтобы пользователь имел возможность работать с ним не более чем через интерфейс a, а внутренний объект (чтобы понятней было допустим администратор) имел возможность работать и через интерфейс a и через интерфейс b P/S почему если не понимаешь вопрос, считаешь его глупым или что то в этом роде?
Сомневаюсь что в php все таки такое предусмотрено, нах**на тогда вообще интерфесы? ради мимолетного instanceof? Ну хоть что-то, хотя пользы практически не приносит, неужели придется что то типа адаптора писать?
для этой задачи в новом php можно будет использовать traits (пока в ветке trunk) а интерфейсы штука важная: если тип аргумента метода интерфейс, а не класс, повышается гибкость, позволяя любому классу реализовать этот интерфейс
Ti Спасибо за информацию, но это несовсем то что нужно Фактически об этом я и говорю, но передавать то мы будем класс с этим интерфейсом, помоему в любом языке все было бы нормально, но ведь *ля пхп то круче всех, он же не типизирован, и что? Получается доступны и методы вне интерфейса...
karlozzz прочие методы объекта не должны иметь значения для клиента определенного интерфейса, ибо он "подписывается" использовать конкретный интерфейс
Ti Подписываться то подписывается и по стандартам так оно и будет, но все же надеялся, что хотябы исключение какое нить чтоб всплывало в случае чего, а то теоретически стандарты то нарушены, метод то открытый, хотя он служебный, но нужен для связи объектов в структуре
Профессионалы ООП ... что вы советуете человеку особенно что он не правильно задачу поставил! А полиморфизм это не ООП а ... вот это он и хочет. К слову наследование это самая жёсткая связь в ООП которой нужно как можно больше сторонится. karlozzz Реализуй одним классом два интерфейса - это в PHP можно. Затем передавай в любой метод объект с указанием типа интерфейса объект будет себя вести полиморфно. Код (Text): <?php class MyClass implements anInterface, anotherInterface { //... } class A { public function setAnInterface(anInterface $anInterface) { } public function setAnotherInterface(anotherInterface $anotherIntarface) { } } ?>
Greg1978 Хрен. В смысле: [js] class MyClass implements anInterface, anotherInterface { public function aMethod(){ ..... //Это от anInterface } public function anotherMethod(){ ..... //Это от anotherInterface } //... } class A { public function setAnInterface(anInterface $anInterface) { $anInterface->aMethod(); // выполниться как и должно $anInterface->anotherMethod(); // выполниться. А хочется чтоб выскочил хотя бы нотис. } public function setAnotherInterface(anotherInterface $anotherIntarface) { } } $a=new A(); $my=new MyClass(); $a->setAnInterface($my); [/js]
Volt(220) Тихо Тихо ... Опять прежняя ошибка ... с архитектурой и проектировкой, да и пониманием определения интерфейсов. В начале вспомните что такое интерфейс, для чего существует сам interface и с какой целью! он вообще проектируется!?
Greg1978 Спасибо за советы, но как было, так и осталось, конечно класс реализует несколько интерфейсов, но как писал Volt(220), пхп на это немного пох**, ответьте на вопрос, для чего в пхп вообще нужны интерфейсы, такое чувство, что если бы их небыло, все аналогичные им функции можно было бы на бумажке написать (всмысле просто инструкция, с какими методами работать и как их создавать), только разве что instanceof небыло бы и все, что вы по этому поводу считаете? С наступающим НГ!!!
блин, данная задача не имеет решения в контексте предоставленных данных и условий. интерфейсы существуют не для разделения одного и того же класса, а для обязательности реализации объявленных методов интерфейсов внутри класса - вот и всё. задачу, заданную в начале топика, нужно решать по другому, пересмотреть подход как минимум. возможно придётся писать адаптер, либо же внутри класса создать метод, проверяющий права текущего пользователя. хотя вполне возможно я тоже чего-то недопонимаю
Gromo Спасибо за мнение, но если говорить прямо, то существует класс, который служит для объединения объектов в структуру (управленец выводом, менеджер таблицы, драйвер), они через него друг с другом работают, и хотелось бы, чтобы разработчик создавая этот класс не имел доступ к методам их взаимодействия, одно решение придумал, если получится - отпишусь
как сказал Gromo немного подучите проектирование именно проектирование в стиле ООП, тогда и интерфейсы поймёте
Greg1978 Подскажите что именно подучить? Не вижу альтернативы реализовать данную структуру, а что касается интерфейсов, я их понимаю, но склонен считать, что в пхп основная задача интерфейсов - проконтролировать, не были ли забыты в реализации определенные методы и правильно ли они описаны (в плане аргументов)
Определение интерфейс, класс и т.п. не привязаны к определённому языку программирования. Интерфейс объекта он и на PHP и на Assemblere только реализация их разная. Это все вещи ООП архитектуры.
Greg1978 1) Какой компилятор ассемблера позволяет работать с объектами? интересно 2) что подучить? 3) кроме изложенного мной выше, вы можете хотябы одно предназначение интерфейсов написать?