Crie classes , e . A classe possui atributos e . A classe possui atributos , e (os dois últimos são booleanos). A classe herda das duas classes anteriores, e adiciona os atributos e . Todos os atributos possuem getters e setters. Crie a hierarquia de herança múltipla, um construtor e um método print na classe derivada. Crie um exemplo para testar sua hierarquia.
Passo 1
Vamos lá, pessoal
Essa é uma questão de herança dupla onde vamos criar duas classes base e e depois construir a classe derivada . O detalhe da questão está no atributo que existe dentro das duas classes base, e por consequência os métodos e também existem dentro das duas classes.
A primeira solução que você pode pensar é em simplesmente usar polimorfismo para dar prioridade a uma das classes. Mas acontece que o representa o nome da pessoa, enquanto representa o nome do inseto. Esses atributos tem o mesmo nome, mas representam coisas diferentes. Ou seja, precisamos fazer de um jeito em os dois atributos continuem existindo, mas que não gere ambiguidades
Mas pra começar, vamos escrever o cabeçalho do código.
Passo 2
Vamos começar escrevendo a classe base .
Essa classe possui dois atributos privados, que deve ser e que deve ser inteiro.
Em seguida, vamos criar um construtor para a classe. Lembre-se que os construtores são quase sempre públicos. O construtor vai receber e inicializar os valores dos atributos e :
Vamos definir setters e getters para os atributos privados.
Vamos começar pelo atributo . Como discutimos no passo anterior, esse atributo e seus setter e getter aparecem dentro das duas classes bases. Então, o primeiro passo para evitar ambiguidades é definir os métodos com nomes iguais como virtuais. Então vamos declarar e como métodos virtuais.
Show. Agora desenvolvemos os setter e getter para o atributo . Aqui não tem segredo nem treta:
E assim finalizamos a classe
Passo 3
O passo seguinte é desenvolver a classe :
Aqui temos três atributos, o que representa o nome do inseto, e os atributos booleanos e que determinam algumas características desse inseto. Vamos encapsular todos os atributos como privados.
Mudaremos agora para o encapsulamento público, e vamos desenvolver um construtor que recebe e inicializa os valores dos três atributos da classe:
E o passo seguinte é desenvolver os métodos setters e getters dessa classe.
Vamos começar pelo atributo , pois como já falamos, temos que lembrar esse atributo e seus setters e getters existem dentro das duas classes base, então para evitar ambiguidades, o primeiro passo é declarar os métodos como virtuais:
Belezinha. Agora, pra criar os setters e getters dos atributos e não tem grilo:
E prontinho, a classe está prontinha.
Passo 4
Da hora! Agora é a parte mais importante da questão! Vamos criar a classe derivada usando duas classes como base: e . Lembre-se que pra efetuar uma herança múltipla a gente faz assim:
No código fica assim:
Beleza. A classe possui dois atributos adicionais e os dois do tipo . Então vamos declarar esses atributos com encapsulamento privado:
Mudando para o encapsulamento público, vamos definir um construtor para a classe . Mas pra agilizar esse processo, vamos executar os construtores das classes mãe.
A gente primeiro declara o construtor da classe filha recebendo todos os parâmetros, depois usamos o operador e executamos os construtores das classes mães, entregando pra elas os parâmetros necessários:
Isso vai garantir que as classes herdadas sejam inicializadas corretamente. E depois, é só a gente abrir as chaves, e dentro do método construtor inicializar os atributos exclusivos da classe filha.
No nosso código temos apenas duas classes mães, então fica assim:
Repare que dentro das chaves a gente inicializou os atributos e que são exclusivos da classe derivada.
Belezinha, seguindo em frente, precisamos criar setters e getters para os atributos e :
Os demais atributos herdados já possuem setters e getters que também foram herdados.
O problema são os métodos e , pois a gente possui duas cópias de cada um desses métodos, uma vinda de e outra vinda de . Normalmente, a gente simplesmente escolheria usar a versão de uma classe e ignoraríamos a versão da outra classe...
Acontece que o atributo e representam coisas diferente, o primeiro representa o nome humano e o segundo representa o tipo de inseto. Então não podemos ignorar nenhum dos dois, pois eles representam coisas diferentes.
Mas não criemos pânico! A solução é simples! Primeiro, vamos criar um polimorfismo para os métodos e e vamos fazer eles atuarem sobre o conteúdo de
E o que faremos a respeito do conteúdo existente em ? Simples! Vamos criar dois métodos novos: que executa o método e o método que executa o
Viu! Foi facinho!
E pra terminar a classe, vamos desenvolver o método que simplesmente retorna um textinho engraçadinho com as características desse herói. O detalhe é que todos os atributos herdados são privados, e por isso devem ser acessados através dos métodos getters.
E prontinho! Classe concluída!
Passo 5
Beleza! Agora é só testar o nosso código.
Vou criar um objeto da classe e inicializa-lo com alguns valores aleatórios:
O resultado é:
E prontinho! Questão finalizada!