Допустим, мне нужна группа классов для реализации все методы X, Y и Z для правильной работы. В этом случае я могу позволить им реализовать общий интерфейс, чтобы форсировать это.
Теперь мой случай немного отличается — мои классы должны быть реализованы по крайней мере, один из X, Y и Z, не обязательно все из них. Интерфейсы не могут помочь мне здесь. Самая близкая вещь, о которой я могу думать, — это общий родитель — он может проверить существование X, Y или Z в своей конструкции.
Я бы предпочел избежать здесь наследования, потому что мне может понадобиться реализовать этот «интерфейс» в классе, у которого уже есть родитель. Итак, есть ли другой элегантный способ сделать это?
(Я работаю в PHP, но если существует общее ООП-решение, оно может служить более широкой аудитории.)
Я бы предпочел избежать здесь наследования, потому что мне может понадобиться реализовать этот «интерфейс» в классе, у которого уже есть родитель. Итак, есть ли другой элегантный способ сделать это?
Если я вас правильно понял, вы можете решить эту проблему через Черты:
trait DefaultImpl
{
public function x()
{
echo "Default implementation of x()\n";
}
public function y()
{
echo "Default implementation of y()\n";
}
public function z()
{
echo "Default implementation of z()\n";
}
}
class XImpl
{
use DefaultImpl;
public function x()
{
echo "Custom implementation of X\n";
}
}
$x = new XImpl();
$x->x();
$x->y();
$x->z();
Это не очень хорошее решение с точки зрения дизайна. Но это лучше, чем ненужное наследование.
Других решений пока нет …