Переопределить публичный метод в подклассе таким образом, чтобы ограничить публичный доступ, но при этом разрешить доступ из родительского класса?

У меня есть универсальный класс 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;
     }
}

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос