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

[Dúvida] imprimir() funciona mesmo sem aplicar polimorfismo

Olá!

Na aula, o instrutor cria a classe abstrata Imprimivel, que tem um método abstrato paraTexto(). Essa classe é usada para tipar os objetos que uma função imprimir() recebe:

export function imprimir(...objetos: Imprimivel[]){
    for(let objeto of objetos) {
        console.log(objeto.paraTexto());
    }
}

Depois, as classes Negociacao e Negociacoes "extendem" de Imprimivel e implementam o paraTexto(). Com isso, o instrutor ensina polimorfismo e explica que isso é feito para que Negociacao e Negociacoes possam ser utilizadas como argumento de imprimir:

imprimir(negociacao, this.negociacoes);

No entanto, eu fiz um teste e não incluí o extends em Negociacao e Negociacoes, ou seja, elas não são mais Imprimivel. Mas eu mantive a implementação do paraTexto() nas duas. Não houve nenhum erro em imprimir() e o projeto rodou corretamente. Caso eu removesse o método paraTexto(), aí sim o TypeScript me informava erro em imprimir().

Então ficam minhas dúvidas: era necessário fazer que Negociacao e Negociacoes "extendessem" Imprimivel? Por que meu código rodou? O TypeScript implicitamente aplica o polimorfismo para essas classes?

Obrigado.

3 respostas
solução!

Oi Matheus, tudo bem?

Desculpe a demora em retornar.

Primeiramente, é importante entender que o polimorfismo é uma técnica da programação orientada a objetos que permite que objetos de diferentes classes possam ser tratados de forma uniforme, como se fossem do mesmo tipo. Isso é feito através da utilização de herança e/ou interfaces, onde os objetos herdam ou implementam os mesmos métodos, permitindo que possam ser tratados de forma polimórfica.

No seu caso, a classe Imprimivel é uma interface que define um método abstrato paraTexto(). Isso significa que qualquer classe que implemente essa interface deve obrigatoriamente implementar o método paraTexto(). A função imprimir() recebe um ou mais objetos que implementam a interface Imprimivel e chama o método paraTexto() de cada objeto para imprimi-lo na tela.

A partir disso, o instrutor do curso ensina o conceito de polimorfismo, mostrando como as classes Negociacao e Negociacoes podem estender a classe Imprimivel e implementar o método paraTexto(), permitindo que possam ser utilizadas como argumento da função imprimir().

No entanto, você testou o código sem estender as classes Negociacao e Negociacoes da classe Imprimivel, mas manteve a implementação do método paraTexto(). E o código funcionou corretamente, sem gerar erros na função imprimir(). Mas por quê?

Isso aconteceu porque o TypeScript é uma linguagem que permite a tipagem estática, ou seja, ele verifica o tipo dos objetos em tempo de compilação e não em tempo de execução. Portanto, se você passar um objeto que não implementa a interface Imprimivel para a função imprimir(), o TypeScript irá gerar um erro de compilação, informando que esse objeto não pode ser passado como argumento.

No seu caso, mesmo sem estender as classes Negociacao e Negociacoes da classe Imprimivel, o TypeScript identifica que essas classes implementam o método paraTexto(), que é o método exigido pela interface Imprimivel. Por isso, mesmo sem utilizar o polimorfismo de forma explícita, o TypeScript consegue identificar que essas classes podem ser tratadas como objetos do tipo Imprimivel e permite que sejam passadas como argumento para a função imprimir().

No entanto, é importante destacar que, embora o código tenha funcionado corretamente nesse caso específico, é uma boa prática utilizar o polimorfismo de forma explícita, extendendo as classes da interface Imprimivel. Isso torna o código mais legível e facilita a manutenção no futuro, já que evita erros e torna mais claro quais são os objetos que podem ser passados como argumento para a função imprimir().

Espero que tenha te ajudado.

Um abraço e bons estudos.

Obrigado, Lorena, por estar passando a limpo todas essas minhas dúvidas, com uma resposta super completa!

Oi Matheus,

Por nada, fico feliz em ajudar :D

Abraços.