Por que o Java não suporta herança privada / protegida como C ++? [fechadas]

12

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?

Rumit Parakhiya
fonte
16
Não é necessário um motivo para omitir um recurso, é necessário um motivo (idealmente, vários bons) para adicioná-lo.
1
Isso só pode ser respondido especulativamente, votando para fechar.
Jimmy Hoffa

Respostas:

10

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.

pswg
fonte
1
Vale ressaltar que em C ++ existem algumas diferenças importantes entre herança privada e inclusão como membro, mas elas giram em torno da ordem de inicialização e herança múltipla e, portanto, não se traduzem no sistema de objetos mais simples de Java.
Jan Hudec
2
-1: " Qualquer benefício que a herança privada / protegida lhe proporcione pode ser facilmente alcançada por meio de encapsulamento." Errado. Eu concordo com " A maioria dos benefícios ..."
Thomas Eding 6/14
@ThomasEding Você pode dar um exemplo de algo que pode ser alcançado por herança privada / protegida, mas não por encapsulamento (ou pelo menos algo que exigiria muito trabalho para ser realizado com encapsulamento)? Sinceramente, não consigo pensar em um, mas estou aberto a ser convencido.
Pswg 6/05
2
Opa, desculpe por isso. Aqui estão alguns exemplos em C ++. (1) Suponha que você queira considerar internamente a classe Bcomo uma A( Bherdada em particular de A) 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 separada A'(provavelmente uma classe interna) que implementa a funcionalidade que você usa. Você também precisará delegar alterações manualmente na Bclasse pai ( Bfaz A'um amigo, A'aceita uma referência a B). Suponho que isso não seja muito difícil de fazer, mas gera uma bagunça no código. (Cont)
Thomas Eding
2
... (2) Se você deseja Bacessar variáveis ​​protegidas A, a herança privada é novamente mais simples de implementar sobre a composição. Com a composição, você pode implementar da A'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).
Thomas Eding
9

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.

Bart van Ingen Schenau
fonte