JavaRush /Blogue Java /Random-PT /Pausa para café #95. Como resolver o problema de herança ...

Pausa para café #95. Como resolver o problema de herança múltipla em Java

Publicado no grupo Random-PT
Fonte: FreeCodeCamp Java é uma das linguagens de programação orientada a objetos mais populares usadas atualmente. Por ser independente de plataforma, você pode encontrar aplicativos Java em todos os tipos de dispositivos e sistemas operacionais. E como Java é relativamente fácil de aprender, é uma das linguagens que muitos programadores dominam. Um recurso importante do Java com o qual você deve estar familiarizado é a herança de classes. A herança permite otimizar seu código, facilitando a reutilização de classes. Quando você pode reutilizar código que já foi testado e depurado, o ciclo de vida de desenvolvimento de software se torna mais curto e menos dispendioso. Pausa para café #95.  Como resolver o problema de herança múltipla em Java – 1Embora seja um conceito simples em teoria, a codificação de relacionamentos de herança requer atenção aos detalhes. Especialmente no que diz respeito à herança múltipla, onde uma classe filha herda propriedades de múltiplas classes pai. Java rejeita múltiplos relacionamentos de herança porque eles criam ambigüidade, mas há várias maneiras de obter muitos dos mesmos efeitos se você souber o que fazer. Neste artigo, veremos problemas com herança múltipla e discutiremos opções alternativas de codificação em Java.

Terminologia de herança

Às vezes, para se tornar um programador de sucesso, você precisa se tornar um solucionador de problemas para encontrar soluções alternativas para erros ou problemas comuns. Esta é uma parte essencial da codificação segura e inteligente. Um desses problemas está relacionado à herança múltipla (ou melhor, à falta dela) em Java. Pausa para café #95.  Como resolver o problema de herança múltipla em Java - 2Para compreender completamente a herança em Java, você precisa estar familiarizado com a terminologia básica de herança da programação orientada a objetos (OOP).
  • As classes são a estrutura de padrão fundamental em linguagens de programação orientadas a objetos. Uma classe define propriedades comuns para um grupo de objetos.
  • Classe pai : também conhecida como classes base ou superclasses. Uma classe pai é uma classe extensível que fornece funcionalidade para uma classe filha. Permite reutilização. As definições e funções da classe pai são reutilizadas ao criar classes filhas.
  • Classe filha : Mais genericamente chamada de subclasse, uma classe filha herda funcionalidade de outra classe. As classes filhas são classes estendidas ou derivadas.
  • Herança : o relacionamento entre as classes pai e filho.

Tipos de herança OOP

Existem muitas linguagens de programação orientadas a objetos populares em uso hoje, incluindo Java, C++, JavaScript, Python, PHP, Ruby e Perl. Embora herança seja um conceito comum entre essas linguagens OOP, nem todos os tipos de herança existem em cada uma dessas linguagens. É extremamente importante conhecer os tipos comuns de herança e as restrições à herança na linguagem específica que você está usando. Quanto mais você souber sobre herança, mais eficaz você se tornará um desenvolvedor. Os tipos de herança suportados por Java incluem:
  • Herança de nível único : quando uma classe filha herda recursos de uma única classe pai.
  • Herança multinível : Esta é uma forma multinível de herança de nível único. Na herança multinível, uma classe filha também pode atuar como classe pai para outras classes filhas. A relação entre cada nível é linear - nenhuma ramificação vai além do que com herança múltipla. Neste caso, a classe filha final possui funções de todos os níveis acima.
  • Herança hierárquica : O oposto da herança múltipla. Na herança hierárquica, uma única classe pai possui mais de uma classe filha. Então, em vez de ter ramificações acima, ramifica-se abaixo.
  • Herança Híbrida : Como o nome sugere, a herança híbrida é uma combinação de outros tipos de herança.
Além dos tipos de herança listados acima, existem outros tipos que Java não suporta.
  • Herança múltipla : na herança múltipla, uma classe filha possui mais de uma classe pai. Embora Java e JavaScript não suportem herança múltipla, linguagens OOP como C++ suportam.
  • Herança de múltiplos caminhos : um híbrido de herança múltipla, multinível e hierárquica. Na herança de múltiplos caminhos, uma classe filha herda suas características e funções da classe pai e de várias classes filhas da classe pai. Como a herança multipath é baseada em herança múltipla, Java não suporta seu uso.

Por que Java não suporta herança múltipla

O principal problema da herança múltipla é que ela pode criar ambigüidades nas classes filhas. Em um white paper de 1995, o designer-chefe de Java, James Gosling, afirmou que problemas com herança múltipla foram uma das razões pelas quais o Java foi criado. As complexidades inerentes à herança múltipla são vistas mais claramente no problema do diamante. No problema do diamante, a classe pai A tem duas classes filhas distintas B e C; isto é, as classes filhas B e C estendem a classe A. Pausa para café #95.  Como resolver o problema de herança múltipla em Java - 3Agora criamos uma nova classe filha D que estende a classe B e a classe C. Observe que temos herança múltipla (D estende B e C), herança hierárquica (B e C estendem A) e herança multinível (D estende A, B e C). No problema do diamante, as classes filhas B e C herdam um método da classe pai A. Tanto B quanto C substituem o método herdado. Mas os novos métodos em B e C se contradizem. A classe filha final D herda dois métodos independentes e conflitantes de seus múltiplos pais B e C. Não está claro qual método da classe D deve ser usado, então surge ambiguidade. Outras linguagens de programação OOP implementam diferentes métodos para resolver a ambigüidade da herança múltipla.

Como resolver o problema de herança múltipla em Java

Só porque a herança múltipla é problemática não significa que seja inútil. Existem muitas situações em que você pode querer que uma classe tenha funções de várias outras classes. Pense no Tesla Roadster que você comprará quando se tornar um desenvolvedor de software extremamente bem-sucedido. Suas características técnicas baseiam-se tanto na classe dos carros esportivos quanto na classe dos veículos elétricos. Outro exemplo: o navegador através do qual você está lendo este artigo. Possui recursos da classe de soluções de privacidade da Internet e da classe geral de navegadores da Internet. Mas você não pode estender múltiplas classes em Java. Então, como essa linguagem lida com o problema da herança múltipla? Java usa estruturas chamadas interfaces. Interfaces são tipos abstratos que definem o comportamento a ser implementado pelas classes. Por serem abstratas, as interfaces não contêm instruções detalhadas sobre seu comportamento. Em vez disso, as classes fornecem implementações concretas do comportamento da interface. As interfaces têm várias características definidoras:
  • Ao contrário das classes, você não instancia interfaces. Em vez disso, as classes implementam interfaces.
  • As interfaces contêm apenas definições de constantes públicas e cabeçalhos de métodos.
  • As interfaces só podem estender outras interfaces, não classes.
  • As interfaces podem estender múltiplas interfaces e as classes podem implementar múltiplas interfaces.
Agora podemos contornar efetivamente o problema do diamante usando interfaces. Lembrando que apenas interfaces podem estender apenas outras interfaces, e qualquer classe que requeira múltiplas características de herança deve implementar múltiplas interfaces, podemos substituir classes com problemas de diamante. O que costumavam ser as classes A, B e C agora se tornam interfaces A, B e C. As interfaces B e C ainda estendem a interface A, mas nenhuma dessas interfaces tem funcionalidade específica, apenas comportamentos específicos. A classe D continua sendo a classe responsável por implementar especificamente o comportamento encontrado nas interfaces B e C. Observe uma diferença importante: a classe D não estende as interfaces B e C. Em vez disso, ela as implementa. Dessa forma, você não tem herança múltipla. Em vez disso, você simplesmente reformulou o problema.

Conclusão

Compreender a herança é essencial para qualquer desenvolvedor Java eficaz. Também é igualmente importante conhecer as limitações da herança e a solução alternativa integrada do Java para problemas tradicionais de herança múltipla. Aprender como criar interfaces para recriar os efeitos da herança múltipla em Java melhorará sua produtividade e oportunidades de contratação.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION