<?php
interface IResolver{
public function resolve();
};
interface IResolveDog extends IResolver{};
interface IResolveCat extends IResolver{};
class Cat implements IResolveCat{
public function resolve(){
echo "I'm a CAT";
}
}
class Dog implements IResolveDog{
public function resolve(){
echo "I'm a DOG";
}
}
class Resolver{
public function resolve( IResolver $r ){
$r->resolve();
}
};
$resolver = new Resolver;
$resolver->resolve( new Cat );
$resolver->resolve( new Dog );
interface IOpenable {
public function action();
};
interface ICloseable {
public function action();
};
class Door implements IOpenable, IClosable {
/* code goes here */
};
function knowHowToOpen(IOpenable $door)
{
/* code goes here */
}
function knowHowToClose(ICloseable $door)
{
/* code goes here */
}
/* instantate a door */
$door;
/* open a door */
KnowHowToOpen($door);
/* close a door */
KnowHowToClose($door);
Вначале ты писал о том, что тебе в одном классе надо применить оба интерфейса, тут же ты привел типичную абстрактную фабрику, только вместо factory() имеем resolve(), но каждый экземпляр фабрики наследует только один из данных интерфейсов. Ты бы лучше определился с тем чего ты хочешь. Если хочешь, чтобы тебе что-то конкретное посоветовали просто покажи свое задание в более широком контексте, а то получается, что все это писано вилами по воде.fixxxer,
Один в один агрегатор интерфейсов. Мне уже предложенных на другом форуме. После пары итераций получилось:
Думаю, что такими декораторами можно решить более половины всех подобных случаев.PHP:Interface IResolveDog { /** * @param Name * @return Dog */ public function resolve(Name $name); }; Interface IResolveCat { /** * @param Name * @return Cat */ public function resolve(Name $name); }; class CatDog { /* a lot of code goes here */ /** * @return IResolveDog */ public function asIResoveDog() { return new DogResolver($this); } /** * @return IResolveCat */ public function asIResoveCat() { return new CatResolver($this); } }; class DogResolver implements IResolveDog { public function __construct(CatDog $implementation) { /* construct Proxy */ } /** * {@inheritdoc} */ public function resolve(Name $name) { /* code for a dog goes here */ } };
Если бы это был C++, то можно было расширить каждый из интерфейсов дополнительно и добавить по методу с другим названием, а потом оба унаследовать невиртуально и реализовать. Тогда в классе оказалось бы два разных метода с совершенно одинаковыми сигнатурами, но делающими совершенно разные вещи, потому что это были бы два совершенно разных метода.
В VC это можно сделать в точности, как в C#.
С C# ещё удобнее: просто два разных метода объявляются в классе и назначаются каждый на свой интерфейс.
Ясно, что разруливание такой ситуации, которая встречается чуть чаще, чем никогда не может быть простым. Но уровень удобства в цепочке PHP->Java->C++->C# понижается.
interface IResolveCat {
public function resolveCat();
};
interface IResolveDog {
public function resolveDog();
};
это вообще не проблемаWMix,
PHP:interface IOpenable { public function action(); }; interface ICloseable { public function action(); }; class Door implements IOpenable, IClosable { /* code goes here */ }; function knowHowToOpen(IOpenable $door) { /* code goes here */ } function knowHowToClose(ICloseable $door) { /* code goes here */ } /* instantate a door */ $door; /* open a door */ KnowHowToOpen($door); /* close a door */ KnowHowToClose($door);
function knowHowToOpen(IOpenable $door)
{
$door->action()
}
это врятли вообще можно реализовать и на плюсах тожеВ PHP нельзя реализовать два метода с одинаковой сигнатурой в классе, несмотря на то, что они могут принадлежать разным методам.
Если строго, то да. Но методы IResolveCat::resolve и IResolveDog::resolve в действительности имеют различную сигнатуру, так как символ resolve ничего не значит, он находится в том или ином пространстве имён.ни один язык не поддерживает наличие нескольких методов с одинаковой сигнатурой
public interface IResolveDog {
Dog resolve(Name);
}
public interface IResolveCat {
Cat resolve(Name);
}
public class CatDog: IResolveCat, IResolveDog {
Cat IResolveCat.resove(Name)
{
/* code for a Cat goes here */
}
Dog IResolveDog.resove(Name)
{
/* code for a Dog goes here */
}
}