Переопределить публичный метод в подклассе таким образом, чтобы ограничить публичный доступ, но при этом разрешить доступ из родительского класса?
У меня есть универсальный класс 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 ()), но это нарушило бы принципы DRY.
Чего я не хочу делать:
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;
}
}
Если бы я сделал вышеупомянутое, мне пришлось бы переопределить полдюжины методов (некоторые из которых довольно сложные), и они отличались бы от метода родительского класса только на несколько символов.
Итак ... какие еще есть варианты? Существуют ли разные средства для достижения одной цели ...?