2009-12-29 2 views
0

У меня есть общий класс Collection, с множеством общедоступных методов получения.Переопределить общедоступный метод в подклассе таким образом, который ограничивает общий доступ, сохраняя при этом доступ к родительскому классу?

Чтобы получить один элемент из коллекции, вы вызываете get(). Существует также несколько методов, которые возвращают несколько элементов: getMany(), getRange(), getAll(), find(), findAll(), query(), queryAny() и т. Д.

Внутренне все эти методы которые возвращают несколько элементов, имеют цикл, который вызывает get() несколько раз, поскольку они агрегируют отдельные элементы для возврата.

Упрощенный пример:

public function get($key){ 
    return $this->collection[$key]; 
} 

public function getMany($keys){ 

    $many = array(); 

    foreach ($keys as $key){ 
     $many[] = $this->get($key); 
    } 

    return $many; 
} 

Проблема возникает, когда я хочу, чтобы расширить коллекцию таким образом, что я не хочу, чтобы клиент сможет получить доступ один элемент из коллекции. В принципе, я хочу запретить доступ к методу get().

Я не могу сделать get() частной или защищенной функцией, потому что она является общедоступной в родительском классе.

Я также не могу переопределить get() таким образом, чтобы сделать его нефункциональным (т.е. переопределить его только с возвратом или выбросить исключение), поскольку все остальные методы полагаются на get() и Я хочу, чтобы они оставались функциональными.

Я знаю, что могу просто переопределить все методы, которые полагаются на get(), чтобы полагаться на некоторый новый защищенный метод (т. Е. GetOne()), но это нарушит принципы СУХОЙ.

ЧТО Я НЕ ХОЧУ ДЕЛАТЬ:

class DataSet extends Collection{ 

    public function get(){ 
     throw new Exception('get() not implemented in DataSet'); 
    } 

    protected function getOne($key){ 
     return parent::get($key); 
    }  

    public function getMany($keys){ 

     $many = array(); 

     foreach ($keys as $key){ 
      $many[] = $this->getOne($key); 
     } 

     return $many; 
    } 
} 

Если я выше, я бы переопределить полдюжины методов (некоторые из которых являются довольно сложными), и они 'd только отличаются от метода родительского класса несколькими символами.

Итак ... какие еще варианты у меня есть? Существуют ли разные средства для того же конца ...?

ответ

3

Что вы можете сделать, это сделать защищенный метод _get, и это может быть то, что вызовут все методы внутри. Затем вы можете выставить метод get для всех классов, которым нужен доступ, и просто позвонить ему _get.

+0

D'oh! Это было решение, скрывающееся на виду. Все мои усилия были сосредоточены на поиске решений в подклассе - я не рассматривал изменение родительского класса. Благодаря! –

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