Überschreiben Sie die öffentliche Methode in der Unterklasse auf eine Weise, die den öffentlichen Zugriff einschränkt und gleichzeitig den Zugriff von der übergeordneten Klasse zulässt.

Ich habe eine generische Collection-Klasse mit einer Vielzahl von Methoden zum öffentlichen Abrufen.

Um ein Objekt aus der Sammlung zu erhalten, rufen Sie get () auf. Es gibt auch mehrere Methoden, die mehrere Elemente zurückgeben: getMany (), getRange (), getAll (), find (), findAll (), query (), queryAny () usw.

Intern haben alle diese Methoden, die mehrere Elemente zurückgeben, eine Schleife, die get () wiederholt aufruft, da sie die einzelnen zurückzugebenden Elemente 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 tritt auf, wenn ich die Sammlung so erweitern möchte, dass der Client nicht auf ein einzelnes Element aus der Sammlung zugreifen kann. Grundsätzlich möchte ich den Zugriff auf die Methode get () nicht zulassen.

Ich kann get () nicht zu einer privaten oder geschützten Funktion machen, da sie in der übergeordneten Klasse öffentlich ist.

Ich kann get () auch nicht so überschreiben, dass es nicht mehr funktioniert (dh mit nur einem Return überschreiben oder eine Exception auslösen), weil alle anderen Methoden auf get () beruhen und ich möchte, dass sie dies tun funktionsfähig bleiben.

Ich weiß, dass ich alle Methoden, die sich auf get () stützen, überschreiben könnte, um mich auf eine neue geschützte Methode (d. H. GetOne ()) zu stützen, aber das würde gegen die DRY-Prinzipien verstoßen.

WAS ICH NICHT TUN WILL:

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 das oben Genannte tun würde, müsste ich ein halbes Dutzend Methoden überschreiben (von denen einige recht komplex sind), und sie würden sich nur um einige Zeichen von der Methode der Elternklasse unterscheiden.

Also ... welche anderen Optionen habe ich? Gibt es verschiedene Mittel zum gleichen Zweck ...?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage