Definition 1: Wenn für jedes Objekt O1 vom Typ T1 ein Objekt O2 vom Typ T2 vorliegt, so dass alle in T1 definierten Programme p keine Änderung des Verhaltens haben, wenn alle Objekte O1 durch O2 ersetzt werden, ist Typ T2 ein Subtyp des Typs T1.
Definition 2: Alle Orte, die sich auf Basisklassen beziehen, müssen in der Lage sein, Objekte seiner Unterklassen transparent zu verwenden.
Der Ursprung des Problems: Es gibt eine Funktion P1, die von Klasse A abgeschlossen ist. Jetzt ist es erforderlich, die Funktion P1 zu erweitern, und die erweiterte Funktion ist p, wobei P aus der ursprünglichen Funktion P1 und der neuen Funktion P2 besteht. Die neue Funktion P wird durch Unterklasse B von Klasse A ausgefüllt. Unterklasse B kann dazu führen, dass die ursprüngliche Funktion P1 beim Ausfüllen der neuen Funktion P2 fehlschlägt.
Lösung: Befolgen Sie bei Verwendung der Vererbung dem Prinzip des Richter -Austauschs. Wenn die Klasse B der Klasse A erbt, versuchen Sie zusätzlich zum Hinzufügen neuer Methoden, um die neue Funktion P2 auszuführen, sondern auch die Methoden der übergeordneten Klasse A nicht neu und versuchen Sie, die Methoden der übergeordneten Klasse A nicht zu überlasten.
Die Vererbung enthält die Bedeutung von: jede Methode, die in der übergeordneten Klasse (im Vergleich zu abstrakten Methoden) implementiert wurde, besteht tatsächlich darin, eine Reihe von Spezifikationen und Verträgen zu setzen. Obwohl nicht alle Unterklassen dazu gezwungen werden, diesen Verträgen einzuhalten, wird das gesamte Vererbungssystem das gesamte Vererbungssystem schädigen, wenn die Unterklasse willkürlich ändert. Das Prinzip des Lizur -Ersatzes drückt diese Bedeutung aus.
Die Vererbung ist als eines der drei wichtigen, objektorientierten Merkmale großer Programmen, aber auch Nachteile. Die Verwendung von Vererbung bringt beispielsweise die Invasivität in das Programm, die Portabilität des Programms verringert und erhöht die Kopplung zwischen Objekten. Wenn eine Klasse von anderen Klassen geerbt wird und diese Klasse geändert werden muss, müssen alle Unterklassen berücksichtigt werden. Nachdem die übergeordnete Klasse geändert wurde, können alle Funktionen mit Unterklassen fehlschlagen.
Beispiel:
öffentliche Klasse Rechteck {int width; int Höhe; öffentliches Rechteck (int w, int h) {width = w; Höhe = H; } public int getArea () {Return Width*Höhe; }} public class Square erweitert das Rechteck {public square (int w, int h) {Super (w, h); } public int getArea () {return width*width; }} public class test {public static void main (String [] args) {rechteck rechteck = neues rechteck (10, 20); // quadratisches Rechteck = neues Quadrat (10, 20); System.out.println ("Bereich:"+rechteck.getArea ()); }}
Wenn wir das Rechteck -Rechteck durch das Quadratklassenquadrat ersetzen, ist die Fläche, die wir gefunden haben, falsch, da wir die GetArea -Methode der übergeordneten Klasse beim Erben neu schreiben. Dies verstößt gegen das Prinzip des Lissianerersatzes.
Hier ist natürlich nur ein Beispiel, wir werden dies in den tatsächlichen Projekten nicht ändern.
Zusammenfassen:
1. Versuchen Sie, die übergeordnete Klassenmethode nicht neu zu schreiben, sondern Ihre eigenen einzigartigen Methoden hinzuzufügen.
2. Während die Erbschaft große Bequemlichkeit in das Programmieren bringt, bringt es auch Nachteile. Wenn eine Klasse von anderen Klassen geerbt wird und diese Klasse geändert werden muss, müssen alle Unterklassen berücksichtigt werden. Nachdem die übergeordnete Klasse geändert wurde, können alle Funktionen mit Unterklassen Fehler aufweisen.