n++ //увеличиваем n на единицу
В таком виде это утверждение просто не верно.попытки использования интерфейсов для указания различного поведения - противоречит смыслу и цели интерфейсов
SplDoublyLinkedList implements Iterator , ArrayAccess , Countable {
};
1) С чего бы она была огромной - я твой монитор не вижу и мысли не читаю... по ходу пьесы у тебя появляются все новые условия, придумай еще чего-нить - не стесняйся.Redjik, получилось, что WeightResolver должен знать ОГРОМНУЮ IEntity, хотя в пакете для WeightResolver разработчики не имеют понятия, что кроме веса будет ещё и цвет. IEntity существует только в моём проекте. WeightResolver и ColorResolver принадлежат различным проектам и также не имеют общих предков.
class Cat implements IResolveCat { ... }
class Dog implements IResolveDog { ... }
class CatDog {
public function __construct(Cat $cat, Dog $dog) {
$this->cat = $cat;
$this->dog = $dog;
}
public function getCat() {
return $this->cat;
}
public function getDog() {
return $this->dog;
}
}
Я уже неоднократно писал, что IResolveCat и IResolveDog не полиморфны
определись ужпопытки использования интерфейсов для указания различного поведения
Ну так, на радио приемнике для дураков есть надписи под ручками что в ООП мире будет выглядеть как-то такНо это одно устройство, которое не представляет ценности, если его разорвать.
class RadioFacade implements IRadio
{
public function setFrequency($level)
{
$this->getFrequencyModule()->set($level);
}
public function setPower($level)
{
$this->getPowerModule()->set($level);
}
}
class FrequenyModule implements IFrequence
{
protected $level;
public function set($level)
{
$this->level = level;
}
}
class PowerModule implements IPower
{
protected $level;
public function set($level)
{
$this->level = level;
}
}
Один в один агрегатор интерфейсов. Мне уже предложенных на другом форуме. После пары итераций получилось:Вообще, у тебя должно быть как-то так:
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++, то можно было расширить каждый из интерфейсов дополнительно и добавить по методу с другим названием, а потом оба унаследовать невиртуально и реализовать. Тогда в классе оказалось бы два разных метода с совершенно одинаковыми сигнатурами, но делающими совершенно разные вещи, потому что это были бы два совершенно разных метода.к ты собираешься реализовать метод resolve такой, что он удовлетворяет одновременно двум РАЗНЫМ интерфейсам
.определись уж
Определится, что эти неполиморфные разные интерфейсы с одинаковыми сигнатурами в принципе могут логически делать на одном и том же объекте.Определиться с чем?
Эти интерфейсы не полиморфны? -- Да. Эти интерфейсы делают что-то разное? -- Да. У них есть методы с одинаковой сигнатурой? -- Да.
namespace vendor {
struct IResolveCat {
virtual void resolve() =0;
virtual ~IResolveCat()
{
}
};
struct IResolveDog {
virtual void resolve() =0;
virtual ~IResolveDog()
{
}
};
void functionRequiresIResolveCat(vendor::IResolveCat& resolver)
{
resolver.resolve();
}
void functionRequiresIResolveDog(vendor::IResolveDog& resolver)
{
resolver.resolve();
}
} // namespace vendor
namespace my_namespace {
struct IResolveCat: public vendor::IResolveCat {
virtual void resolve()
{
resolveCat();
}
virtual void resolveCat() =0;
virtual ~IResolveCat()
{
}
};
struct IResolveDog: public vendor::IResolveDog {
virtual void resolveDog() =0;
virtual void resolve()
{
resolveDog();
}
virtual ~IResolveDog()
{
}
};
class Resolver: public virtual IResolveCat, public virtual IResolveDog {
public:
virtual void resolveCat();
virtual void resolveDog();
};
void Resolver::resolveCat()
{
std::cout << "I'm a CAT resolved by Resolver" << std::endl;
}
void Resolver::resolveDog()
{
std::cout << "I'm a DOG resolved by Resolver" << std::endl;
}
} //namespace my_namespace
.... эм, окей, хорошо, что я почти не пишу на C++, раз там могут наворотить такое для простенькой задачкиВот так бы это выглядело на C++:
делает тоже самое!class RadioFacade implements IRadio