У меня есть общий класс 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 только отличаются от метода родительского класса несколькими символами.
Итак ... какие еще варианты у меня есть? Существуют ли разные средства для того же конца ...?
D'oh! Это было решение, скрывающееся на виду. Все мои усилия были сосредоточены на поиске решений в подклассе - я не рассматривал изменение родительского класса. Благодаря! –