¿Por qué Java no admite herencia privada / protegida como C ++? [cerrado]

12

Al heredar una clase en C ++, el usuario puede especificar el especificador de acceso como,

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.
};

Pero lo mismo no es posible en Java, es decir, se extiende en Java siempre es como herencia "pública" en C ++.

¿Alguien podría explicar la razón de esto?

Rumit Parakhiya
fuente
16
No se necesita una razón para omitir una característica, se necesita una razón (idealmente, varias buenas) para agregarla.
1
Esto solo se puede responder especulativamente, votando para cerrar.
Jimmy Hoffa

Respuestas:

10

La mayoría de los beneficios que le brinda la herencia privada / protegida se pueden lograr fácilmente a través de la encapsulación. Thomas Eding ha proporcionado algunos buenos ejemplos de casos que podrían facilitarse con la adición de herencia privada / protegida, y aunque estos son casos válidos, existen soluciones que no requieren una herencia privada / protegida y son más 'idiomáticos' (en Java en menos).

Los desarrolladores del lenguaje Java evidentemente sintieron que el costo en complejidad necesario para soportar la herencia privada / protegida (incluida la herencia múltiple) superaba el beneficio que proporcionaría.

pswg
fuente
1
Vale la pena señalar que en C ++ hay algunas diferencias importantes entre la herencia privada y la inclusión como miembro, pero giran en torno al orden de inicialización y la herencia múltiple y, por lo tanto, no se traducen en el sistema de objetos más simple de Java.
Jan Hudec
2
-1: " Cualquier beneficio que la herencia privada / protegida le brinde puede lograrse fácilmente mediante la encapsulación". Incorrecto. Estoy de acuerdo con " La mayoría de los beneficios ..."
Thomas Eding
@ThomasEding ¿Puede dar un ejemplo de algo que se puede lograr a través de una herencia privada / protegida pero no a través de la encapsulación (o al menos algo que requeriría una gran cantidad de trabajo para lograr la encapsulación)? Sinceramente, no puedo pensar en uno, pero estoy abierto a ser convencido.
pswg
2
Vaya, perdón por eso. Aquí hay algunos ejemplos en C ++. (1) Suponga que desea considerar internamente la clase Bcomo A( Bhereda de Aforma privada ) para que pueda usarla polimórficamente en algún método. Con la composición, esto se puede hacer, pero es mucho más complicado. Aquí necesitaría crear una subclase separada A'(probablemente una clase interna) que implemente la funcionalidad que utiliza. También necesitaría delegar manualmente los cambios a la Bclase principal ( Bhace A'un amigo, A'acepta una referencia B). Supongo que esto no es demasiado difícil de hacer, pero incurre en un desastre en el código. (Cont)
Thomas Eding
2
... (2) Si desea Bacceder a variables protegidas A, la herencia privada es nuevamente más sencilla de implementar que la composición. Con la composición, podría implementar de A'manera similar a la anterior, y / o aumentar el acceso de las variables protegidas. (3) Suponga que desea una única variable miembro estática compartida que sea la misma variable exacta en las instancias de plantilla. Una solución es heredar de forma privada de una clase base sin plantilla que tenga el miembro estático. La composición no puede resolver este problema, aunque sí otras técnicas (como hacer amigos con el miembro).
Thomas Eding
9

Como Java no tiene herencia múltiple y todo tiene que ser heredado (públicamente) Object, no hay lugares en Java donde la herencia privada o protegida produzca un programa válido.

Bart van Ingen Schenau
fuente