Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist Richters Substitutionsprinzip? (Beispiel)

Was ist Richters Substitutionsprinzip? (Beispiel)

藏色散人
藏色散人nach vorne
2019-04-15 15:42:328352Durchsuche

Liskov-Substitutionsprinzip

Liskov-Substitutionsprinzip LSP spricht über die Beziehung zwischen Basisklassen und Unterklassen. Nur wenn diese Beziehung besteht, liegt die Richter-Substitutionsbeziehung vor. Wenn die Beziehung zwischen zwei bestimmten Klassen A und B gegen das Design von LSP verstößt (vorausgesetzt, es handelt sich um eine Vererbungsbeziehung von B nach A), können Sie entsprechend der spezifischen Situation eine der beiden folgenden Rekonstruktionslösungen auswählen.

<?php
//举例说明继承的风险,我们需要完成一个两数相减的功能,由类A来负责。
class a{
public $width;
public $height;
public function func1($a, $b){  
        return $a - $b;  
    }
}
$a = new a();
echo $a->func1(100,50);
//运行结果100-50=50

Später müssen wir eine neue Funktion hinzufügen: Vervollständigen Sie die Addition zweier Zahlen und summieren Sie sie dann mit 100, was von Klasse B verarbeitet wird. Das heißt, Klasse B muss zwei Funktionen ausführen:

Der Code für die Verwendung von Klasse B zum Erben von Klasse A lautet wie folgt:

class b extends a{  
    public function func1($a, $b){  
        return $a + $b;
    }  
      
    public function func2($a, $b){  
        return $this->func1($a, $b) + 100;
    } 
}
$b = new b();
echo $b->func2(100, 50);

Angenommen, Klasse B schreibt versehentlich die Methode der übergeordneten Klasse neu Beim Benennen der Methode führt dies dazu, dass alle Codes, die die Subtraktionsfunktion ausführen, alle die umgeschriebene Methode der Klasse B aufrufen, was zu einem Fehler in der Funktion fun1 führt, die ursprünglich normal ausgeführt wurde (der Grund für den Fehler ist, dass Subtraktion in Addition und andere Benutzer geändert wurden). Ich weiß es nicht. Denken Sie nicht immer, dass der Code von einer Person geschrieben wurde und niemand Zeit hat, Ihren Code Zeile für Zeile zu lesen, sie wenden ihn einfach gemäß den Regeln an.

Laienhaft ausgedrückt lautet das Liskov-Substitutionsprinzip: Unterklassen können die Funktionen der übergeordneten Klasse erweitern, aber sie können die ursprünglichen Funktionen der übergeordneten Klasse nicht ändern. Es enthält die folgenden 4 Bedeutungsebenen:

1. Unterklassen können abstrakte Methoden der übergeordneten Klasse implementieren, jedoch keine nicht-abstrakten Methoden der übergeordneten Klasse überschreiben.

2. Sie können Unterklassen Ihre eigenen einzigartigen Methoden hinzufügen.

3. Wenn eine Methode einer Unterklasse eine Methode einer übergeordneten Klasse überschreibt, sind die Voraussetzungen der Methode (d. h. die formalen Parameter der Methode) lockerer als die Eingabeparameter der Methode der übergeordneten Klasse.

4. Wenn eine Methode einer Unterklasse eine abstrakte Methode einer übergeordneten Klasse implementiert, sind die Nachbedingungen der Methode (d. h. der Rückgabewert der Methode) strenger als die der übergeordneten Klasse.

Es scheint unglaublich, denn wir werden feststellen, dass wir in unserer eigenen Programmierung oft gegen das Liskov-Substitutionsprinzip verstoßen, das Programm aber trotzdem gut läuft. Jeder wird sich also fragen: Welche Konsequenzen hat es, wenn ich darauf bestehe, das Liskov-Substitutionsprinzip nicht zu befolgen?

Die Konsequenz ist: Die Wahrscheinlichkeit von Problemen mit dem von Ihnen geschriebenen Code wird erheblich erhöht.

Das obige ist der detaillierte Inhalt vonWas ist Richters Substitutionsprinzip? (Beispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:hcoder.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen