Implemente a hierarquia de herança múltipla definida pelo diagrama abaixo:
Passo 1
E aí, galera.
Essa é uma questão de herança dupla. Vamos precisar implementar as classes e e em seguida vamos herdar essas duas classes na classe filha
O detalhe é a as duas classes mães, e , possuem o atributo em comum. Além disso, elas possuem os métodos e em comum também, o que pode gerar ambiguidade. Então vamos levar isso em consideração na hora de construir as classes mães e na hora efetuar a herança.
Quando a gente tiver construindo as classes e devemos lembrar que os métodos e devem ser virtuais. E quando a gente efetuar a herança, dentro da classe vamos ter que executar polimorfismo para evitar ambiguidades.
Mas pra começar, vamos escrever o cabeçalho do código:
Passo 2
Vamos começar desenvolve a classe . Se a gente der uma olhada no diagrama oferecido pela questão, vemos que essa classe tem dois atributos privados. É importante notar isso, pois atributos privados não diretamente acessíveis dentro da classe filha.
A classe também possui vários métodos públicos, um método construtor para inicializar os atributos, e métodos getters e setters para cada um dos atributos. Os métodos getters e setters são importantes pois serão as únicas formas da classe filha acessar os atributos da classe
Ok, vamos então escrever o código. Iniciamos a classe
E em seguida declaramos os atributos dentro do encapsulamento privado.
Em seguida, em encapsulamento público, desenvolvemos o construtor da classe:
E pra cada um dos atributos vamos criar um método getter e setter.
Começando com os métodos e . Aqui a gente tem que pensar um pouco no futuro, e lembrar que a classe também vai ter métodos com esses nomes. Então, já prevemos que haverá ambiguidades na execução da herança dupla. Então, para nos prevenir, vamos utilizar a palavra-chave na declaração de e
Em seguida, podemos criar os métodos e :
E assim, podemos finalizar a classe .
Passo 3
Show. Agora vamos dar uma olhada na classe
Observando o diagrama fornecido no enunciado, vemos que essa classe também possui dois atributos privados, um construtor público e os métodos getters e setters. Lembrando que é importante desenvolver os getters e setters para permitir que a classe filha tenha acesso aos atributos da classe
Então, primeiro iniciamos a classe:
E, no encapsulamento privado, declaramos os atributos:
Depois, mudamos para público e criamos o construtor:
E pra cada um dos atributos vamos criar um método getter e setter.
Mais uma vez, temos que lembrar que os métodos e existem nas duas classes mães. Então teremos que fazer esses métodos serem virtuais:
E pra finalizar a nossa classe, vamos criar os métodos e
E assim concluímos a classe
Passo 4
Belezinha, estamos com as classes base da questão concluídas. Agora criar a classe derivada
A classe é composta por uma herança dupla, e por mais um atributo privado , por um construtor e pelos métodos método , e .
Então vamos começar efetuando a herança dupla. Lembre-se que pra criar uma herança dupla a gente faz assim:
E em seguida, a gente declara o atributo privado:
Show. Mudando para o encapsulamento público, vamos iniciar o construtor da classe . Lembrando que o construtor de uma classe filha pode executar o construtor de todas as classes mães, dessa forma:
Então, o construtor da classe filha recebe todos os parâmetros necessários para iniciar a classe, e para iniciar os atributos herdados a gente executa os construtores das classes mães entregando os parâmetros necessários para cada construtor. E para o atributo que existe apenas dentro da classe filha, a gente faz sua inicialização dentro das chaves do método construtor.
O passo seguinte é desenvolver os métodos getters e setters. Vamos começar criando os mais simples o e o
Agora, a gente tem que lembrar que temos um problema sobre os métodos e . Acontece que temos duas cópias de cada um deles, pois esses métodos existem dentro das duas classes mães e
O que temos que fazer é executar um polimorfismo e escolher qual versão do método queremos utilizar. No caso dessa questão, os dois métodos funcionam exatamente iguais, então podemos escolher a versão de qualquer uma das classes mães sem problemas. Lembre-se que pra executar a versão de um método da classe mãe a gente faz assim:
Então vamos fazer. Primeiro a gente inicia um polimorfismo do método e dentro das chaves a gente executa a versão de existente na classe e retorna o resultado.
E para o método a gente faz quase a mesma coisa: inicia o polimorfismo do método, e dentro das chaves a gente executa a versão de que existe dentro da classe mãe . Detalhe é que o método recebe um valor, então temos que receber esse valor na construção do polimorfismo e passar esse valor para o
Beleza, a classe está quase pronta. Mas antes precisamos criar um método que imprime o conteúdo da classe. Aqui não tem segredo, é só usar o várias vezes para imprimir todos os atributos. O detalhe é que os atributos herdados privados só podem ser acessados através de métodos getters:
E pronto. A classe está concluída.
Passo 5
Agora só falta gente testar tudo.
Vamos criar um objeto da classe e iniciar com valores aleatórios, e depois é só executar e ver o resultado:
E o resultado é:
E pronto! Questão feita.