Heim > Backend-Entwicklung > PHP-Tutorial > Warum kann ich keinen Subtyp im Parameter einer überschriebenen Methode verwenden?

Warum kann ich keinen Subtyp im Parameter einer überschriebenen Methode verwenden?

Barbara Streisand
Freigeben: 2024-11-13 16:32:02
Original
510 Leute haben es durchsucht

Why Can't I Use a Subtype in an Overridden Method's Parameter?

Parameterkovarianz in überschreibenden Methoden

In der objektorientierten Programmierung ermöglichen überschreibende Methoden Unterklassen, ihre eigenen Versionen von Methoden zu implementieren, die in der Oberklasse definiert sind . Beim Überschreiben einer Methode müssen jedoch die Parameter und der Rückgabetyp mit der Deklaration der Oberklassenmethode kompatibel sein.

Im angegebenen Code haben wir ein Szenario mit den folgenden Schnittstellen:

<code class="php">interface Engine {
    function run();
}

interface HydroEngine extends Engine {
    function run();
}</code>
Nach dem Login kopieren

Und eine ähnliche Struktur für Klassen:

<code class="php">interface Car {
    function setEngine(Engine $engine);
}

interface WaterCar extends Car {
    // This method is intended to override Car::setEngine()
    function setEngine(HydroEngine $engine);
}</code>
Nach dem Login kopieren

Das Problem tritt auf, wenn versucht wird, setEngine() in WaterCar zu überschreiben:

<code class="php">Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)</code>
Nach dem Login kopieren

Dieser Fehler tritt auf, weil der Parametertyp von setEngine() in WaterCar ist HydroEngine, ein Untertyp von Engine, während der Parametertyp in der Oberklasse Car Engine ist.

Das Liskov-Substitutionsprinzip (LSP) regelt solche Szenarien. Der LSP gibt an, dass ein Subtyp (z. B. HydroEngine) für seinen Supertyp (z. B. Engine) ersetzbar sein muss, ohne die Funktionalität des Programms zu beeinträchtigen. Dieses Prinzip gilt jedoch nicht für Parametertypen in überschriebenen Methoden.

In diesem Fall implementiert WaterCar Car nicht vollständig, da es einen engeren Parametertyp in setEngine() akzeptiert. Dies liegt daran, dass ein WaterCar nur HydroEngines akzeptieren kann, während ein Car jeden Motor akzeptieren kann. Dies verstößt gegen LSP und bricht den von der Superklasse Car festgelegten Vertrag.

Um dieses Problem zu beheben, stellen Sie sicher, dass die Parametertypen in den überschriebenen Methoden mit den Deklarationen der Superklasse kompatibel sind. In diesem Beispiel könnte WaterCar::setEngine() wie folgt geändert werden:

<code class="php">function setEngine(Engine $engine): void;</code>
Nach dem Login kopieren

Diese Änderung behält die Kompatibilität mit Car::setEngine() bei und ermöglicht WaterCar gleichzeitig, sich auf die Annahme von HydroEngines zu spezialisieren.

Das obige ist der detaillierte Inhalt vonWarum kann ich keinen Subtyp im Parameter einer überschriebenen Methode verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage