Warum gibt der Compiler eine Fehlermeldung, wenn Sie die Sichtbarkeit einer Methode reduzieren, während sie in der Unterklasse überschrieben wird?Warum können Sie die Sichtbarkeit einer Methode in einer Java-Unterklasse nicht reduzieren?
Antwort
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.
Da Subtypen als Instanzen ihres Supertypes verwendet werden können.
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.
- 1. Reduzieren Sie den Code mit einer Methode
- 2. Bedeutung von „Kann nicht die Sichtbarkeit der geerbten Methode reduzieren“ mit einer Schnittstelle
- 3. Können Sie die Sichtbarkeit einer GroupBox an die Sichtbarkeit ihrer untergeordneten Elemente binden?
- 4. , warum es mir einen Übersetzungsfehler gibt: Kann nicht die Sichtbarkeit der geerbten Methode von DeclareStuff reduzieren
- 5. Warum können wir nicht ‚this‘ Schlüsselwort in einer statischen Methode
- 6. Gibt es einen Grund, warum Sie den Zugriffsmodifizierer nicht auf einer Methode oder in einer Schnittstelle definieren können?
- 7. UnsupportedOperationException - Warum können Sie toInstant() auf einer java.sql.Date nicht aufrufen?
- 8. Können Sie eine Methode einer Klasse nicht vererben?
- 9. Wie ändere ich die Sichtbarkeit einer Ansicht?
- 10. So reduzieren Sie die Speichernutzung einer WPF-App
- 11. können Sie eine Methode in einer Case-Anweisung aufrufen Ruby
- 12. Warum können Variablen in einer if-Anweisung nicht deklariert werden?
- 13. Warum können Variablen in einer if-Anweisung nicht deklariert werden?
- 14. Wie kann ich die Sichtbarkeit einer Beziehung in UML angeben?
- 15. Können Sie die Rotation in einer iOS-App global deaktivieren?
- 16. Verschiebung reduzieren Konflikte in einer einfachen (?) Grammatik
- 17. Warum können Operatoren in einer statischen Klasse nicht überlastet werden?
- 18. Warum funktioniert getGraphics in einer ActionPerformed-Methode?
- 19. Warum können Sie UnRegisterStartupScript nicht?
- 20. Wie ändere ich die Sichtbarkeit eines Buttons in einer Aktivität basierend auf der Sichtbarkeit eines ImageView in einer anderen Aktivität?
- 21. ASP.Net RadioButton Sichtbarkeit in einer RadioButtonList
- 22. Warum benötigt die statische Methode in einer Schnittstelle keinen Standardzugriffsmodifikator?
- 23. Wie verwenden Sie eine Eigenschaft mit einer nicht statischen Methode, die mit einer geerbten statischen Methode in Konflikt steht?
- 24. Wie können Sie die Höhe einer Zeichenfolge in PostScript erhalten?
- 25. Warum auf eine asynchrone Methode mitten in einer Methode warten?
- 26. Alle Zeilen in einer Tabelle mit einer Schaltfläche erweitern/reduzieren
- 27. Wie können Sie Daten innerhalb einer Methode in eine äußere Methode für einen Return-Aufruf ziehen?
- 28. Rundungsfehler in SVD einer Matrix reduzieren
- 29. Komponententest zum Sicherstellen einer Methode innerhalb einer Methode heißt nicht
- 30. Reduzieren Sie die wiederholte Struktur der Eigenschaften
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
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