Beim überschreiben einer Methode, warum kann ich den Zugang erweitern, aber nicht verringern?
Warum Java angeben, dass die zugriffsspezifizierer für eine überschreibende Methode kann es mehr, aber nicht weniger zugänglich als die überschriebene Methode? Zum Beispiel, eine protected-Instanz-Methode in der übergeordneten Klasse kann öffentlich gemacht werden, aber nicht privat, in der Unterklasse.
- Die Verwendung der gemeinsamen Bezeichnung:
B extends A
wennB is-a A
. Also, wennA
tun könnenaction()
, undB is-a A
, dannB
sollte in der Lage sein zu tunaction()
als gut.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein grundlegendes Prinzip in der OOP: der Kind-Klasse ist ein vollwertiges Instanz der parent-Klasse, und muss deshalb präsentieren mindestens die gleiche - interface wie die Elternklasse. Machen geschützt/öffentlich Dinge, die weniger sichtbar würde, gegen diese Idee; man könnte die Kind-Klassen unbrauchbar als Instanzen der übergeordneten Klasse.
Vorstellen, diese zwei-Klassen:
Konnte ich folgenden code schreiben:
Werden, und es müsste, um gültig zu sein, da auf Tier die Methode getName() ist öffentlich, auch tho war es privat auf Lion. So ist es nicht möglich, die Dinge weniger sichtbar auf Unterklassen, da haben Sie erst einmal eine Oberklasse Referenz, die Sie würde in der Lage sein um Zugriff auf diese Sachen.
Ein Beispiel nehmen, die unten gegeben
Typische überschreiben passiert im folgenden Fall
Hier
p
ist die Objekt-Referenz mit dem Typ Person(super-Klasse), wenn wir anrufenp.display(). Wie der access-modifier wird restriktiver, die Objekt Referenz
p
zugreifen können Kind-Objekt von Typ "Employee"Weil es wäre komisch:
Spät zur party, aber ich möchte hinzufügen: eine größere Sorge mit Bezug zu überschreiben: Die überschreibende Methode muss erlauben, weniger (oder in der gleichen Ebene) throwable exception als die überschriebene Methode; auch nichts throwable überhaupt.
Liskov-substitution-Prinzip erklären kann, dass auch:
Oben, die überschriebene Methode einer Selbstverpflichtung, dass im schlimmsten Fall werfen Sie die DislocationException, nicht mehr (ein Arzt ist erforderlich, am Drehort). Also das überschreiben der Methode müssen nicht brechen, die durch das hinzufügen von mehr DeathException (oder ein Krankenwagen ist ein muss)
Ich oft rufen die Maxime: "[kann] mehr Zugriff [level], [aber] weniger Ausnahme"
Weil eine Unterklasse ist eine Spezialisierung der Oberklasse, oder in anderen Worten, es ist eine Erweiterung der Oberklasse.
Vorstellen, zum Beispiel mit der toString-Methode. Alle Java-Objekte haben, weil die Klasse Object hat es. Stellen Sie sich vor Sie könnten definieren Sie eine Klasse mit der Methode toString private. Sie dann nicht mehr behandeln alle Gegenstände gleich. Zum Beispiel, würden Sie nicht mehr in der Lage, diese sicher:
for (Object obj : collection) System.out.println(obj);
Gut, in Bezug auf den konkreten Fall, die Sie erwähnt, wie genau würde Java damit umgehen? Wenn die Unterklasse aus einer public/protected-Methode private, was soll dann der JVM zu tun, wenn diese Methode aufgerufen wird, eine Instanz der Unterklasse? Zu Ehren der privaten und aufrufen der Superklasse Umsetzung? Weiter, du brichst den Vertrag angegeben durch die Superklasse, wenn Sie plötzlich sagen, "niemand kann auf diese Methode zugreifen, ungeachtet dessen, was der Vertrag zunächst sagte."