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?
java
object-oriented
inheritance
Rumit Parakhiya
quelle
quelle
Antworten:
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.
quelle
B
als eineA
(B
privat von geerbteA
) 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 UnterklasseA'
(wahrscheinlich eine innere Klasse) erstellen , die die von Ihnen verwendete Funktionalität implementiert. Sie müssten Änderungen auch manuell an die übergeordneteB
Klasse delegieren (B
machtA'
einen Freund,A'
akzeptiert einen Verweis aufB
). Ich nehme an, das ist nicht allzu schwer, aber der Code ist durcheinander. (Fortsetzung)B
auf geschützte Variablen in zugreifen möchtenA
, ist die private Vererbung wiederum einfacher zu implementieren als die Komposition. Mit Komposition können SieA'
ä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).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.quelle