Ao herdar uma classe em C ++, o usuário pode especificar o especificador de acesso 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.
};
Mas o mesmo não é possível em Java, ou seja, estende-se em java é sempre como herança "pública" em C ++.
Alguém poderia explicar o motivo disso?
java
object-oriented
inheritance
Rumit Parakhiya
fonte
fonte
Respostas:
A maioria dos benefícios que a herança privada / protegida oferece a você pode ser alcançada facilmente por meio de encapsulamento. Thomas Eding forneceu alguns bons exemplos de casos que poderiam ser facilitados com a adição de herança privada / protegida e, embora sejam casos válidos, existem soluções alternativas que não exigem herança privada / protegida e são mais 'idiomáticas' (em Java em menos).
Os desenvolvedores da linguagem Java evidentemente sentiram que o custo em complexidade necessário para suportar a herança privada / protegida (incluindo herança múltipla) superava o benefício que ela proporcionaria.
fonte
B
como umaA
(B
herdada em particular deA
) para poder usá-la polimorficamente em algum método. Com a composição, isso pode ser feito, mas é muito mais confuso. Aqui você precisaria criar uma subclasse separadaA'
(provavelmente uma classe interna) que implementa a funcionalidade que você usa. Você também precisará delegar alterações manualmente naB
classe pai (B
fazA'
um amigo,A'
aceita uma referência aB
). Suponho que isso não seja muito difícil de fazer, mas gera uma bagunça no código. (Cont)B
acessar variáveis protegidasA
, a herança privada é novamente mais simples de implementar sobre a composição. Com a composição, você pode implementar daA'
mesma forma como acima, e / ou aumentar o acesso das variáveis protegidas. (3) Suponha que você queira uma única variável de membro estática compartilhada que seja a mesma variável exata nas instanciações do modelo. Uma solução é herdar privadamente de uma classe base não modelada que tenha o membro estático. A composição não pode resolver esse problema, embora outras técnicas possam (como fazer amizade com outra classe com o membro).Como o Java não possui herança múltipla e tudo deve ser herdado (publicamente)
Object
, não há lugares no Java em que a herança privada ou protegida produza um programa válido.fonte