Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Quando é interessante um objeto de um tipo referenciar um local na memória de outro?

Dado as seguintes classes:

public class Funcionario
{ ... }
public class Diretor : Funcionario
{ ... }

Em que momento, seria interessante e faria sentido para mim, instanciar um objeto na forma abaixo?

Funcionario diretor = new Diretor();

Apesar de ser um código válido, uma vez que a classe Diretor herda da classe Funcionario, não consigo pensar em um cenário que isso faça sentido na "vida real", vamos por assim dizer.

Obrigado. Abraços.

6 respostas

Boa noite, Luis! Como vai?

A possibilidade de fazer referência a um objeto de várias formas se chama polimorfismo. Um dos conceitos mais importantes em programação orientada a objetos! Como vc bem citou, nesse caso que vc usou de exemplo, seriam válidas ambas as linhas a seguir.

Funcionario diretor1 = new Diretor();
Diretor diretor2 = new Diretor();

Agora imagine a seguinte situação: temos um sistema com diretores, advogados, gerenes, presidente, etc etc. Todos eles estendem a classe Funcionario e eu quero construir um método que receba como parâmetro um funcionário qualquer e calcule o imposto de renda com base no salário. Se o polimorfismo não existisse, eu teria que criar um método desse pra cada tipo de funcionário que existe. Seria péssimo! Mas graças ao polimorfismo, podemos escrever um único método assim:

public double calculaIR(Funcionario f)
{
        // Lógica do método omitida.
}

Como diretores, gerentes, presidentes e advogados estendem da classe Funcionario esse código funciona perfeitamente em qualquer um dos casos a seguir!

calculaIR(new Diretor());
calculaIR(new Presidente());
calculaIR(new Advogado());

E dessa forma em vez de escrever milhões de métodos de cálculo de IR pra cada um dos tipos de funcionário, escrevo apenas um único método que serve para todos os funcionários! Bem melhor e mais bacana!

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Oi Gabriel, obrigado pela resposta. Entendi o que você disse. Mas eu acho que o que eu quis dizer não ficou bem claro. No nosso curso, a simulação do banco, é um caso bem simples, até por questões didáticas.

Usando o código abaixo

Funcionario diretor = new Diretor();
Diretor diretor2 = new Diretor();

O objeto diretor é um variável do tipo Funcionario que aponta para um objeto Diretor e o diretor2 é uma variável do tipo Diretor que aponta para um outro objeto também Diretor. No cenário proposto pelo instrutor Guilherme, essas duas variáveis são "iguais", vamos por assim dizer. Mas existe algum cenário, onde eu criar uma variável como um tipo possa ser mais vantajoso do que uma variável de outro tipo, mas ambas apontando para um mesmo tipo de objeto na memória?

Obrigado. Abraços

Desassociando do cenário que temos no curso, imaginemos uma situação assim:

class A
{}

class B : A
{}

Imaginando que eu queria criar um objeto do tipo B, eu posso fazer o seguinte:

B objetoB = new B();

ou

A objetoB = new B();

A pergunta é: mesmo ambos cenários funcionando, existe alguma situação onde eu criar o objetoB como uma variável de A possa ser mais vantajoso do que uma variável de B ou vice versa?

solução!

Opa, Luis! Como vai?

A pergunta é: mesmo ambos cenários funcionando, existe alguma situação onde eu criar o objetoB como uma variável de A possa ser mais vantajoso do que uma variável de B ou vice versa?

Se a classe B tiver métodos que a classe A não tem, então vc só conseguirá acessar tais métodos usando uma referência do tipo B. Fora isso, a vantagem do polimorfismo se dá mesmo na prática em situações como a que eu citei em meu primeiro comentário.

Show, valeu Gabriel! Abraços.

Por nada, Luis! Sempre que precisar de alguma ajuda é só mandar aqui no fórum da Alura!

Grande abraço e bons estudos, meu aluno!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software