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?
java
object-oriented
inheritance
Rumit Parakhiya
fuente
fuente
Respuestas:
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.
fuente
B
comoA
(B
hereda deA
forma 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 separadaA'
(probablemente una clase interna) que implemente la funcionalidad que utiliza. También necesitaría delegar manualmente los cambios a laB
clase principal (B
haceA'
un amigo,A'
acepta una referenciaB
). Supongo que esto no es demasiado difícil de hacer, pero incurre en un desastre en el código. (Cont)B
acceder a variables protegidasA
, la herencia privada es nuevamente más sencilla de implementar que la composición. Con la composición, podría implementar deA'
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).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.fuente