Warum unterstützt Java keine private / geschützte Vererbung wie C ++? [geschlossen]


12

Beim Erben einer Klasse in C ++ kann der Benutzer den Zugriffsbezeichner wie folgt angeben:

class Base
{
    public int mem1;
    protected in mem2;
};

class Derived1 : **private** Base
{
    // mem1 will be private here.
    // mem2 will be private here.
};

class Derived2 : **protected** Base
{
    // mem1 will be protected here.
    // mem2 will be protected here.
};

class Derived2 : **public** Base
{
    // mem1 will be public here.
    // mem2 will be protected here.
};

Dasselbe ist jedoch in Java nicht möglich, dh das Erweitern in Java entspricht immer der "öffentlichen" Vererbung in C ++.

Könnte jemand den Grund dafür erklären?


16
Man braucht keinen Grund, um ein Feature wegzulassen, man braucht einen Grund (idealerweise mehrere gute), um es hinzuzufügen.

1
Dies kann nur spekulativ beantwortet werden.
Jimmy Hoffa

Antworten:


10

Die meisten Vorteile, die Ihnen eine private / geschützte Vererbung bietet, lassen sich leicht durch Kapselung erzielen. Thomas Eding hat einige gute Beispiele für Fälle angegeben, die durch das Hinzufügen von privater / geschützter Vererbung vereinfacht werden könnten. Obwohl dies gültige Fälle sind, gibt es Problemumgehungen, die keine private / geschützte Vererbung erfordern und "idiomatischer" sind (in Java unter am wenigsten).

Die Entwickler der Java-Sprache waren offensichtlich der Ansicht, dass die zur Unterstützung der privaten / geschützten Vererbung (einschließlich der Mehrfachvererbung) erforderlichen Komplexitätskosten den daraus resultierenden Nutzen aufwogen.


1
Es ist anzumerken, dass es in C ++ einige wichtige Unterschiede zwischen privater Vererbung und Inklusion als Mitglied gibt, aber sie drehen sich um die Reihenfolge der Initialisierung und der Mehrfachvererbung und werden daher nicht in das einfachere Objektsystem von Java übersetzt.
Jan Hudec

2
-1: " Jeder Vorteil, den private / geschützte Vererbung Ihnen bietet, kann leicht durch Kapselung erreicht werden." Falsch. Ich würde mit " Most Benefits ..." einverstanden sein
Thomas Eding

@ThomasEding Können Sie ein Beispiel für etwas geben, das durch private / geschützte Vererbung, aber nicht durch Kapselung erreicht werden kann (oder zumindest etwas, das viel Arbeit erfordert, um mit Kapselung fertig zu werden)? Ich kann ehrlich gesagt nicht an einen denken, aber ich bin offen dafür, überzeugt zu werden.
pswg

2
Hoppla, tut mir leid. Hier einige Beispiele in C ++. (1) Angenommen, Sie möchten eine Klasse intern Bals eine A( Bprivat von geerbte A) Klasse betrachten, damit Sie sie in einer bestimmten Methode polymorph verwenden können. Mit der Komposition kann man das machen, aber es ist viel chaotischer. Hier müssten Sie eine separate Unterklasse A'(wahrscheinlich eine innere Klasse) erstellen , die die von Ihnen verwendete Funktionalität implementiert. Sie müssten Änderungen auch manuell an die übergeordnete BKlasse delegieren ( Bmacht A'einen Freund, A'akzeptiert einen Verweis auf B). Ich nehme an, das ist nicht allzu schwer, aber der Code ist durcheinander. (Fortsetzung)
Thomas Eding

2
... (2) Wenn Sie Bauf geschützte Variablen in zugreifen möchten A, ist die private Vererbung wiederum einfacher zu implementieren als die Komposition. Mit Komposition können Sie A'ähnlich wie oben implementieren und / oder den Zugriff auf die geschützten Variablen erhöhen. (3) Angenommen, Sie möchten eine einzelne gemeinsam genutzte statische Elementvariable, die für alle Vorlageninstanziierungen dieselbe exakte Variable ist. Eine Lösung besteht darin, privat von einer Basisklasse ohne Vorlage zu erben, die über das statische Element verfügt. Komposition kann dieses Problem nicht lösen, obwohl andere Techniken es könnten (wie zum Beispiel eine andere Klasse mit dem Mitglied anfreunden).
Thomas Eding

9

Da Java keine Mehrfachvererbung besitzt und alles (öffentlich) vererbt werden muss Object, gibt es in Java keine Stellen, an denen eine private oder geschützte Vererbung ein gültiges Programm ergeben würde.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.