n++ //увеличиваем n на единицу
В таком виде это утверждение просто не верно.попытки использования интерфейсов для указания различного поведения - противоречит смыслу и цели интерфейсов
SplDoublyLinkedList implements Iterator , ArrayAccess , Countable {
};
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 */
}
};
к ты собираешься реализовать метод 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