Außer Kraft setzen öffentliche Methode in der Unterklasse in einer Weise, die nach wie vor den Zugang der Öffentlichkeit beschränkt, während der Zugang von Eltern-Klasse ermöglicht?

StackOverflow https://stackoverflow.com/questions/1977027

Frage

habe ich eine generische Klasse Collection, mit einer Vielzahl von öffentlichen Getter-Methoden.

Um ein Element aus der Sammlung zu erhalten, rufen Sie erhalten (). Darüber hinaus gibt es mehrere Methoden, die mehrere Artikel zurückgeben. Getmany (), getRange (), getAll () finden (), findAll (), query (), queryAny (), etc

Intern alle diese Methoden, die mehrere Artikel zurückgeben haben eine Schleife, dass Anrufe get () wiederholt, wie sie die einzelnen Elemente Rückkehr aggregieren.

Ein vereinfachtes Beispiel:

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

public function getMany($keys){

    $many = array();

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

    return $many;
}

Das Problem entsteht, wenn ich Sammlung in einer solchen Art und Weise erweitern wollen, dass ich will nicht der Kunde in der Lage sein, ein einzelnes Element zugreifen aus der Sammlung. Grundsätzlich möchte ich Zugriff auf die Methode get () verbieten.

kann ich keine private oder geschützte Funktion, weil sie die Öffentlichkeit in der übergeordneten Klasse get () machen.

Ich kann auch nicht außer Kraft setzen () in einer solchen Art und Weise erhalten, dass es nicht-funktionalen (dh außer Kraft setzen es mit nur einer Rückkehr oder eine Ausnahme auslösen) macht, weil alle anderen Methoden get () verlassen, und ich will, dass sie funktionsfähig bleiben.

Ich weiß, ich könnte nur alle Methoden außer Kraft setzen, die auf get () verlassen, auf einigen neuen geschützten Verfahren verlassen (das heißt getOne ()), aber das würde DRY Prinzipien verstoßen.

Was ich nicht wollen, zu tun:

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;
     }
}

Wenn ich die oben tat, würde ich ein halbes Dutzend Methoden außer Kraft setzen müssen (einige davon sind sehr komplex), und sie würden sich nur von der übergeordneten Klasse Methode von ein paar Zeichen.

So ... was andere Möglichkeiten habe ich? Gibt es verschiedene Mittel zum selben Zweck ...?

War es hilfreich?

Lösung

Was Sie tun, ist könnte eine geschützte Methode sagen _get machen, und dies kann das sein, was alle Methoden intern nennen. Sie können dann eine get Methode auf alle Klassen aussetzen, dass der Zugang Notwendigkeit und es nur _get nennen haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top