Exercícios Resolvidos de Mais herança e mais polimorfismo

Ver Teoria

Enunciado

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 s t u d a n t e e F u n c i o n a r i o e em seguida vamos herdar essas duas classes na classe filha M o n i t o r

O detalhe é a as duas classes mães, E s t u d a n t e e F u n c i o n a r i o , possuem o atributo N o m e em comum. Além disso, elas possuem os métodos s e t N o m e ( ) e g e t N o m 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 s t u d a n t e e F u n c i o n a r i o devemos lembrar que os métodos s e t N o m e ( ) e g e t N o m e ( ) devem ser virtuais. E quando a gente efetuar a herança, dentro da classe M o n i t o r 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 E s t u d a n t e . 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 E s t u d a n t e

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 g e t N o m e ( ) e s e t N o m e ( ) . Aqui a gente tem que pensar um pouco no futuro, e lembrar que a classe F u n c i o n a r i o 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 v i r t u a l na declaração de g e t N o m e ( ) e s e t N o m e ( )

Em seguida, podemos criar os métodos g e t M a t r i c u l a ( ) e s e t M a t r i c u l a ( ) :

E assim, podemos finalizar a classe E s t u d a n t e .

Passo 3

Show. Agora vamos dar uma olhada na classe F u n c i o n a r i o

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 F u n c i o n a r i o

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 g e t N o m e ( ) e s e t N o m 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 g e t S a l a r i o ( ) e s e t S a l a r i o ( )

E assim concluímos a classe F u n c i o n a r i o .

Passo 4

Belezinha, estamos com as classes base da questão concluídas. Agora criar a classe derivada M o n i t o r

A classe M o n i t o r é composta por uma herança dupla, e por mais um atributo privado D i s c i p l i n a , por um construtor e pelos métodos método p r i n t M o n i t o r , g e t D i s c i p l i n a e s e t D i s c i p l i n a .

Então vamos começar efetuando a herança dupla. Lembre-se que pra criar uma herança dupla a gente faz assim:

c l a s s   N o m e F i l h a   : p u b l i c   M a e 1 ,   p u b l i c   M a e 2

E em seguida, a gente declara o atributo privado:

Show. Mudando para o encapsulamento público, vamos iniciar o construtor da classe M o n i t o r . Lembrando que o construtor de uma classe filha pode executar o construtor de todas as classes mães, dessa forma:

N o m e F i l h a t i p o s   p a r a m s   : M a e 1   p a r a m s   ,   M a e 2 (   p a r a m s   )

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 D i s c i p l i n a 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 g e t D i s c i p l i n a ( ) e o s e t D i s c i p l i n a ( )

Agora, a gente tem que lembrar que temos um problema sobre os métodos g e t N o m e ( ) e s e t N o m e ( ) . Acontece que temos duas cópias de cada um deles, pois esses métodos existem dentro das duas classes mães F u n c i o n a r i o e E s t u d a n t 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:

C l a s s e M a e ∷ n o m e M e t o d o ( )

Então vamos fazer. Primeiro a gente inicia um polimorfismo do método g e t N o m e ( ) e dentro das chaves a gente executa a versão de g e t N o m e ( ) existente na classe E s t u d a n t e e retorna o resultado.

E para o método s e t N o m e a gente faz quase a mesma coisa: inicia o polimorfismo do método, e dentro das chaves a gente executa a versão de s e t N o m e que existe dentro da classe mãe E s t u d a n t e . Detalhe é que o método s e t N o m e recebe um valor, então temos que receber esse valor na construção do polimorfismo e passar esse valor para o E s t u d a n t e ∷ s e t N o m e ( )

Beleza, a classe M o n i t o r está quase pronta. Mas antes precisamos criar um método p r i n t M o n i t o r que imprime o conteúdo da classe. Aqui não tem segredo, é só usar o c o u t 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 M o n i t o r está concluída.

Passo 5

Agora só falta gente testar tudo.

Vamos criar um objeto da classe M o n i t o r e iniciar com valores aleatórios, e depois é só executar e ver o resultado:

E o resultado é:

E pronto! Questão feita.

Resposta