2016-12-02 2 views
0

Предположим, мне нужна группа классов для реализации все методы X, Y и Z для правильной работы. В этом случае я могу позволить им реализовать общий интерфейс, чтобы заставить это.Форсировать классы для реализации одного из множества методов

Теперь мой случай немного отличается - моим классам необходимо реализовать хотя бы один из X, Y и Z, не обязательно все из них. Интерфейсы мне не помогают. Самое близкое, о чем я могу думать, - это общий родитель - он может проверить существование X, Y или Z в своем конструировании.

Я предпочел бы избежать наследования здесь, потому что мне может понадобиться реализовать этот «интерфейс» в классе, у которого уже есть родитель. Итак - есть ли еще один элегантный способ сделать это?

(я работаю в PHP, но если общее OOP решение существует, оно может служить для более широкой аудитории.)

+0

Интерфейсы могут вам помочь. Имеют ли эти интерфейсы общий интерфейс. Dunno, как вы ожидаете сделать это без наследования, если вы не хотите проверять, какой из них он каждый раз. –

+3

Звучит как плохая архитектура/дизайн. Не могли бы вы объяснить (показать нам реальный мир), почему вам нужно «реализовать хотя бы один из X, Y, Z»? –

+0

@WaxCage У нас есть классы для доступа к значениям конфигурации. Некоторые могут извлекать их из БД, другой из файлов конфигурации, другой из жестко закодированных массивов внутри них. Вы можете получить значение из такого класса getAsString(), getAsParamObject() ... или некоторые аналогичные методы. Это определенно плохой дизайн, но это тот, с которым мне приходится работать сейчас. Эти классы конфигурации часто изменяются (и разбиваются), поэтому я хочу обеспечить их основные функции (чтобы получить значение хотя бы как-то), прежде чем реорганизовать все это. –

ответ

1

Я предпочел бы избежать наследования здесь, потому что я, возможно, потребуется осуществить это " интерфейса "в классе, у которого уже есть родитель. Итак - есть ли еще один элегантный способ сделать это?

Если я вас правильно понял, вы можете решить эту проблему с помощью Traits:

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(); 

Это не очень хорошее решение с точки зрения дизайна. Но это лучше, чем ненужное наследование.

Смежные вопросы