{"id":858,"date":"2024-09-30T15:10:55","date_gmt":"2024-09-30T18:10:55","guid":{"rendered":"https:\/\/adrianosantostreina.com.br\/blog\/?p=858"},"modified":"2024-10-16T06:45:42","modified_gmt":"2024-10-16T09:45:42","slug":"poo-3o-pilar-polimorfismo","status":"publish","type":"post","link":"https:\/\/adrianosantostreina.com.br\/blog\/poo-3o-pilar-polimorfismo\/","title":{"rendered":"Poo 3o. Pilar: Polimorfismo"},"content":{"rendered":"\n<p>O <strong>polimorfismo<\/strong> \u00e9 o terceiro pilar da Programa\u00e7\u00e3o Orientada a Objetos (POO) e desempenha um papel essencial ao permitir que objetos de diferentes classes sejam tratados de forma uniforme. Com o polimorfismo, m\u00e9todos podem ser definidos em uma classe base e, posteriormente, sobrescritos em classes derivadas para fornecer comportamentos espec\u00edficos. Isso promove a flexibilidade no desenvolvimento, j\u00e1 que podemos utilizar o mesmo m\u00e9todo em objetos de tipos diferentes, adaptando sua execu\u00e7\u00e3o conforme o objeto em quest\u00e3o.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"has-medium-font-size\"><strong>Por que o Polimorfismo \u00e9 Importante?<\/strong><\/p>\n\n\n\n<p>O polimorfismo \u00e9 fundamental porque ele oferece <strong>flexibilidade<\/strong> e <strong>uniformidade<\/strong> no tratamento de objetos. Em um sistema com diversos tipos de objetos relacionados, como diferentes formas de pagamento (cart\u00e3o, boleto, transfer\u00eancia), ele permite que todos sejam tratados de maneira uniforme, utilizando a mesma interface ou m\u00e9todo. Isso simplifica o c\u00f3digo, pois n\u00e3o h\u00e1 necessidade de saber o tipo espec\u00edfico do objeto para invocar um m\u00e9todo.<\/p>\n\n\n\n<p>Al\u00e9m disso, o polimorfismo facilita a <strong>extens\u00e3o<\/strong> e <strong>manuten\u00e7\u00e3o<\/strong> do c\u00f3digo. Quando um novo tipo de objeto \u00e9 introduzido, como uma nova forma de pagamento, \u00e9 poss\u00edvel implementar uma nova classe e sobrescrever m\u00e9todos sem alterar o c\u00f3digo que j\u00e1 usa o polimorfismo. Isso torna o sistema mais flex\u00edvel e menos propenso a erros ao adicionar novas funcionalidades.<\/p>\n\n\n\n<p>Resumindo, o polimorfismo ajuda a criar sistemas mais modulares e escal\u00e1veis, promovendo a reutiliza\u00e7\u00e3o de c\u00f3digo e a simplifica\u00e7\u00e3o do fluxo de trabalho.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exemplo Pr\u00e1tico Detalhado em Delphi<\/h3>\n\n\n\n<p>Vamos expandir o exemplo pr\u00e1tico de polimorfismo, explicando passo a passo como ele funciona e a import\u00e2ncia de cada parte do c\u00f3digo.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >type\n  \/\/ Classe base para todas as formas de pagamento\n  TPagamento = class\n  public\n    \/\/ M\u00e9todo virtual que ser\u00e1 sobrescrito pelas classes derivadas\n    procedure ProcessarPagamento(Valor: Currency); virtual;\n  end;\n\n  \/\/ Classe derivada para pagamentos com cart\u00e3o de cr\u00e9dito\n  TPagamentoCartao = class(TPagamento)\n  public\n    \/\/ Sobrescreve o m\u00e9todo ProcessarPagamento com comportamento espec\u00edfico\n    procedure ProcessarPagamento(Valor: Currency); override;\n  end;\n\n  \/\/ Classe derivada para pagamentos com boleto banc\u00e1rio\n  TPagamentoBoleto = class(TPagamento)\n  public\n    \/\/ Sobrescreve o m\u00e9todo ProcessarPagamento com comportamento espec\u00edfico\n    procedure ProcessarPagamento(Valor: Currency); override;\n  end;\n\nprocedure TPagamento.ProcessarPagamento(Valor: Currency);\nbegin\n  Writeln('Processando pagamento gen\u00e9rico de R$ ' + CurrToStr(Valor));\nend;\n\nprocedure TPagamentoCartao.ProcessarPagamento(Valor: Currency);\nbegin\n  Writeln('Pagamento de R$ ' + CurrToStr(Valor) + ' processado via Cart\u00e3o de Cr\u00e9dito.');\nend;\n\nprocedure TPagamentoBoleto.ProcessarPagamento(Valor: Currency);\nbegin\n  Writeln('Pagamento de R$ ' + CurrToStr(Valor) + ' processado via Boleto Banc\u00e1rio.');\nend;\n<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Explica\u00e7\u00e3o Detalhada<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Classe Base <code>TPagamento<\/code>:<\/strong>\n<ul class=\"wp-block-list\">\n<li>A classe <code>TPagamento<\/code> \u00e9 a <strong>classe base<\/strong> de onde outras formas de pagamento ir\u00e3o herdar. Ela cont\u00e9m o m\u00e9todo <code>ProcessarPagamento<\/code>, que \u00e9 declarado como <code>virtual<\/code>. Isso significa que esse m\u00e9todo pode ser sobrescrito por classes derivadas. Ele oferece um comportamento gen\u00e9rico para processamento de pagamento, mas o objetivo principal \u00e9 permitir que classes derivadas implementem suas pr\u00f3prias vers\u00f5es deste m\u00e9todo.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >procedure TPagamento.ProcessarPagamento(Valor: Currency);\nbegin\n  Writeln('Processando pagamento gen\u00e9rico de R$ ' + CurrToStr(Valor));\nend;\n<\/pre><\/div>\n\n\n\n<p>O m\u00e9todo da classe base simplesmente exibe uma mensagem gen\u00e9rica de pagamento, mas em situa\u00e7\u00f5es reais, ele poderia incluir l\u00f3gica padr\u00e3o ou at\u00e9 ser um m\u00e9todo abstrato, for\u00e7ando as classes derivadas a implementarem seu comportamento espec\u00edfico.<\/p>\n\n\n\n<p>2. <strong>Classe <code>TPagamentoCartao<\/code>:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A classe <code>TPagamentoCartao<\/code> herda de <code>TPagamento<\/code> e sobrescreve o m\u00e9todo <code>ProcessarPagamento<\/code>. A palavra-chave <code>override<\/code> \u00e9 usada para indicar que estamos substituindo o comportamento da classe base. Aqui, a implementa\u00e7\u00e3o do m\u00e9todo \u00e9 espec\u00edfica para o processamento de pagamentos via cart\u00e3o de cr\u00e9dito.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >procedure TPagamentoCartao.ProcessarPagamento(Valor: Currency);\nbegin\n  Writeln('Pagamento de R$ ' + CurrToStr(Valor) + ' processado via Cart\u00e3o de Cr\u00e9dito.');\nend;\n<\/pre><\/div>\n\n\n\n<p>A classe derivada substitui a implementa\u00e7\u00e3o gen\u00e9rica da classe base e personaliza a l\u00f3gica para processar o pagamento com cart\u00e3o de cr\u00e9dito.<\/p>\n\n\n\n<p>3. <strong>Classe <code>TPagamentoBoleto<\/code>:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Similar \u00e0 classe <code>TPagamentoCartao<\/code>, <code>TPagamentoBoleto<\/code> tamb\u00e9m herda de <code>TPagamento<\/code> e sobrescreve o m\u00e9todo <code>ProcessarPagamento<\/code>. Aqui, a implementa\u00e7\u00e3o \u00e9 espec\u00edfica para pagamentos via boleto banc\u00e1rio.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >procedure TPagamentoBoleto.ProcessarPagamento(Valor: Currency);\nbegin\n  Writeln('Pagamento de R$ ' + CurrToStr(Valor) + ' processado via Boleto Banc\u00e1rio.');\nend;\n<\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Novamente, o polimorfismo entra em a\u00e7\u00e3o, permitindo que diferentes classes implementem o mesmo m\u00e9todo com comportamentos distintos.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Usando o Polimorfismo no C\u00f3digo<\/h4>\n\n\n\n<p>Agora, vamos ver como o polimorfismo se aplica quando trabalhamos com inst\u00e2ncias dessas classes:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >var\n  Pagamento: TPagamento;\nbegin\n  \/\/ Processando pagamento com cart\u00e3o de cr\u00e9dito\n  Pagamento := TPagamentoCartao.Create;\n  try\n    Pagamento.ProcessarPagamento(100.0);  \/\/ Chama o m\u00e9todo sobrescrito de TPagamentoCartao\n  finally\n    Pagamento.Free;\n  end;\n\n  \/\/ Processando pagamento com boleto banc\u00e1rio\n  Pagamento := TPagamentoBoleto.Create;\n  try\n    Pagamento.ProcessarPagamento(150.0);  \/\/ Chama o m\u00e9todo sobrescrito de TPagamentoBoleto\n  finally\n    Pagamento.Free;\n  end;\nend;\n<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Explica\u00e7\u00e3o do Uso<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Inst\u00e2ncias Polim\u00f3rficas:<\/strong> Note que, em ambos os casos, estamos utilizando a vari\u00e1vel <code>Pagamento<\/code>, que \u00e9 do tipo <code>TPagamento<\/code> (classe base), mas, gra\u00e7as ao polimorfismo, ela pode armazenar objetos de suas classes derivadas (<code>TPagamentoCartao<\/code> ou <code>TPagamentoBoleto<\/code>).<\/li>\n\n\n\n<li><strong>M\u00e9todos Sobrescritos:<\/strong> Quando chamamos <code>ProcessarPagamento<\/code>, o Delphi identifica dinamicamente qual m\u00e9todo deve ser executado com base no tipo do objeto que est\u00e1 armazenado na vari\u00e1vel. No primeiro caso, <code>TPagamentoCartao<\/code>, o m\u00e9todo sobrescrito de <code>TPagamentoCartao<\/code> \u00e9 chamado. No segundo caso, <code>TPagamentoBoleto<\/code>, o m\u00e9todo sobrescrito de <code>TPagamentoBoleto<\/code> \u00e9 executado.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Benef\u00edcios do Polimorfismo<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Simplicidade:<\/strong> O c\u00f3digo que usa o polimorfismo pode trabalhar com objetos de diferentes tipos sem precisar saber o tipo exato do objeto. Isso permite que o c\u00f3digo seja mais simples e f\u00e1cil de manter.<\/li>\n\n\n\n<li><strong>Extensibilidade:<\/strong> Novos tipos de pagamento podem ser adicionados ao sistema (como pagamentos via PIX, por exemplo), simplesmente criando novas classes derivadas e sobrescrevendo o m\u00e9todo <code>ProcessarPagamento<\/code>. N\u00e3o h\u00e1 necessidade de alterar o c\u00f3digo que j\u00e1 utiliza a classe base <code>TPagamento<\/code>.<\/li>\n\n\n\n<li><strong>Reutiliza\u00e7\u00e3o de C\u00f3digo:<\/strong> O polimorfismo permite reutilizar a estrutura da classe base, aplicando comportamentos espec\u00edficos apenas onde necess\u00e1rio, o que reduz a duplica\u00e7\u00e3o de c\u00f3digo e promove a reutiliza\u00e7\u00e3o.<\/li>\n<\/ol>\n\n\n\n<p>Com o polimorfismo, voc\u00ea pode facilmente criar sistemas escal\u00e1veis e flex\u00edveis, adaptando o comportamento dos objetos sem precisar modificar o c\u00f3digo existente que j\u00e1 utiliza esses objetos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\"><strong>O que veremos a seguir?<\/strong><\/h3>\n\n\n\n<p>No pr\u00f3ximo artigo, vamos explorar o quarto e \u00faltimo pilar da Programa\u00e7\u00e3o Orientada a Objetos: <strong>Abstra\u00e7\u00e3o<\/strong>. Abstra\u00e7\u00e3o nos permite simplificar a complexidade do c\u00f3digo, focando apenas nos aspectos essenciais de um objeto, enquanto escondemos os detalhes de implementa\u00e7\u00e3o. Veremos como usar abstra\u00e7\u00e3o para criar sistemas mais organizados e escal\u00e1veis, com exemplos pr\u00e1ticos em Delphi. Prepare-se para entender como abstrair comportamentos e criar interfaces claras e simples, facilitando a evolu\u00e7\u00e3o do seu c\u00f3digo!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Participe da Comunidade no Telegram<\/h3>\n\n\n\n<p>\ud83d\ude80 Quer continuar essa discuss\u00e3o e trocar ideias com outros desenvolvedores? Junte-se \u00e0 nossa comunidade no Telegram! L\u00e1, voc\u00ea pode comentar sobre o que achou deste artigo, tirar suas d\u00favidas e compartilhar suas experi\u00eancias com POO e Delphi, e ainda discutir ou tirar suas d\u00favidas sobre os mais variados temas em uma comunidade com mais de 1.000 desenvolvedores.<\/p>\n\n\n\n<p>\ud83d\udd17 <a href=\"https:\/\/t.me\/AdrianoSantosCommunity\" target=\"_blank\" rel=\"noreferrer noopener\">Clique aqui para entrar na comunidade<\/a><\/p>\n\n\n\n<p>Te vejo l\u00e1!<\/p>\n\n\n\n<p>Adriano Santos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O polimorfismo \u00e9 o terceiro pilar da Programa\u00e7\u00e3o Orientada a Objetos (POO) e desempenha um papel essencial ao permitir que objetos de diferentes classes sejam tratados de forma uniforme. Com o polimorfismo, m\u00e9todos podem ser definidos em uma classe base e, posteriormente, sobrescritos em classes derivadas para fornecer comportamentos espec\u00edficos. Isso promove a flexibilidade no [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":861,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-858","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/858","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/comments?post=858"}],"version-history":[{"count":2,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/858\/revisions"}],"predecessor-version":[{"id":860,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/858\/revisions\/860"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media\/861"}],"wp:attachment":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media?parent=858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/categories?post=858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/tags?post=858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}