2009-10-21 3 views

Antwort

65

Da jede Instanz der Unterklasse immer noch eine gültige Instanz der Basisklasse sein muss (siehe Liskov substitution principle).

Wenn die Unterklasse plötzlich eine Eigenschaft der Basisklasse verloren hat (z. B. eine öffentliche Methode), wäre sie kein gültiger Ersatz für die Basisklasse mehr.

+2

Aber warum dürfen wir eine geschützte Methode nicht überschreiben und sie zu privat ändern? Da die öffentliche Schnittstelle immer noch dieselbe ist, wird LSP auf diese Weise nicht unterbrochen. – Pacerier

+0

Die öffentliche Schnittstelle ändert sich nicht, aber die geschützte Schnittstelle. Code in der Elternklasse kann nicht auf die Methoden seiner eigenen Fleisch und Blut zugreifen :( – Elazar

1

Da Subtypen als Instanzen ihres Supertypes verwendet werden können.

18

Denn wenn dies erlaubt wurde, die folgende Situation möglich wäre:

Klasse Sub erbt von Klasse Parent. Parent hat eine öffentliche Methode foo, Sub macht diese Methode privat. Nun ist die folgende Code kompilieren in Ordnung, weil der deklarierte Typ von bar ist Parent:

Parent bar = new Sub(); 
bar.foo(); 

aber es ist nicht klar, wie diese sich verhalten soll. Eine Möglichkeit wäre, einen Laufzeitfehler zu verursachen. Ein anderes wäre, es einfach zu erlauben, was es möglich machen würde, eine private Methode von außen aufzurufen, indem man einfach auf die Elternklasse überträgt. Keine dieser Alternativen ist akzeptabel, also ist es nicht erlaubt.

Verwandte Themen