<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wx="http://ilps.science.uva.nl/WikiXML/wx" xml:lang="pt" lang="pt">
<head>
<title>Polimorfismo</title>
<meta name="wx_namespace" content="0"/>
<meta name="wx_pagename" content="Polimorfismo"/>
<meta name="wx_page_id" content="132505"/>
</head>
<body>
<div id="wx_article">
<wx:section level="1" title="Polimorfismo" id="wxsec1"><h1 class="pagetitle" id="wx1">Polimorfismo</h1>

<p id="wx2"><wx:template id="wx_t1" pagename="Predefinição:Minidesambig" page_id="63422"/></p>

<dl id="wx3">
<dd id="wx4"><font color="#000000" face="Verdana" id="wx5"><b id="wx6">Nota:</b></font> <i id="wx7">Se procura outros significados para <b id="wx8">Polimorfismo</b>, consulte <a href="/wpt/Polimorfismo_%28desambigua%C3%A7%C3%A3o%29" title="Polimorfismo (desambiguação)" wx:linktype="known" wx:pagename="Polimorfismo_(desambiguação)" wx:page_id="346415" id="wx9">Polimorfismo (desambiguação)</a></i>
<p id="wx10">.<wx:templateend start="wx_t1"/></p>
</dd>
</dl>

<wx:template id="wx_t2" pagename="Predefinição:Orientação_a_objeto" page_id="628590"/>
<table align="right" class="toccolours" style="margin-left: 15px;" id="wx11">
<tr id="wx12">
<td align="center" bgcolor="#ccccff" id="wx13"><b id="wx14"><a href="/wpt/Orienta%C3%A7%C3%A3o_a_objetos" title="Orientação a objetos" wx:linktype="known" wx:pagename="Orientação_a_objetos" wx:page_id="13586" id="wx15">Orientação a objetos</a><br id="wx16"/>
</b> </td>
</tr>

<tr id="wx17">
<td id="wx18"><a href="/wpt/Objeto" title="Objeto" wx:linktype="known" wx:pagename="Objeto" wx:page_id="45465" id="wx19">Objeto</a> </td>
</tr>

<tr id="wx20">
<td id="wx21"><a href="/wpt/Classe_%28programa%C3%A7%C3%A3o%29" title="Classe (programação)" wx:linktype="known" wx:pagename="Classe_(programação)" wx:page_id="69870" id="wx22">Classe</a><br id="wx23"/>
<ul id="wx24">
<li id="wx25"><a href="/wpt/Inst%C3%A2ncia_%28classe%29" title="Instância (classe)" wx:linktype="known" wx:pagename="Instância_(classe)" wx:page_id="192038" id="wx26">Instância</a></li>
</ul>
</td>
</tr>

<tr id="wx27">
<td id="wx28"><a href="/wpt/Abstra%C3%A7%C3%A3o_%28programa%C3%A7%C3%A3o%29" title="Abstração (programação)" wx:linktype="known" wx:pagename="Abstração_(programação)" wx:page_id="192043" id="wx29">Abstração</a> </td>
</tr>

<tr id="wx30">
<td id="wx31"><a href="/wpt/M%C3%A9todo_%28programa%C3%A7%C3%A3o%29" title="Método (programação)" wx:linktype="known" wx:pagename="Método_(programação)" wx:page_id="185084" id="wx32">Métodos</a><br id="wx33"/>
</td>
</tr>

<tr id="wx34">
<td id="wx35"><a href="/wpt/Atributo_%28programa%C3%A7%C3%A3o%29" title="Atributo (programação)" wx:linktype="known" wx:pagename="Atributo_(programação)" wx:page_id="194895" id="wx36">Atributo</a><br id="wx37"/>
</td>
</tr>

<tr id="wx38">
<td id="wx39"><a href="/wpt/Encapsulamento" title="Encapsulamento" wx:linktype="known" wx:pagename="Encapsulamento" wx:page_id="67459" id="wx40">Encapsulamento</a> </td>
</tr>

<tr id="wx41">
<td id="wx42"><a href="/wpt/Heran%C3%A7a_%28inform%C3%A1tica%29" title="Herança (informática)" wx:linktype="known" wx:pagename="Herança_(informática)" wx:page_id="964553" id="wx43">Herança</a><br id="wx44"/>
<ul id="wx45">
<li id="wx46"><a href="/wpt/Heran%C3%A7a_m%C3%BAltipla" title="Herança múltipla" wx:linktype="known" wx:pagename="Herança_múltipla" wx:page_id="964552" id="wx47">Herança múltipla</a></li>
</ul>
</td>
</tr>

<tr id="wx48">
<td id="wx49"><a href="/wpt/Polimorfismo" title="Polimorfismo" wx:linktype="self" wx:pagename="Polimorfismo" wx:page_id="132505" id="wx50">Polimorfismo</a> </td>
</tr>

<tr id="wx51">
<td align="center" bgcolor="#ccccff" id="wx52"><b id="wx53">Outras referências<br id="wx54"/>
</b> </td>
</tr>

<tr id="wx55">
<td id="wx56"><a href="/wpt/Padr%C3%B5es_de_projeto_de_software" title="Padrões de projeto de software" wx:linktype="known" wx:pagename="Padrões_de_projeto_de_software" wx:page_id="28790" id="wx57">Padrões de projeto</a> </td>
</tr>

<tr id="wx58">
<td id="wx59"><a href="/wpt/UML" title="UML" wx:linktype="known" wx:pagename="UML" wx:page_id="1877" id="wx60">UML</a> </td>
</tr>

<tr id="wx61">
<td id="wx62"><a href="/wpt/Engenharia_de_software_orientado_a_objetos" title="Engenharia de software orientado a objetos" wx:linktype="known" wx:pagename="Engenharia_de_software_orientado_a_objetos" wx:page_id="66202" id="wx63">Engenharia OO</a> </td>
</tr>
</table>

<wx:templateend start="wx_t2"/>
<p id="wx64">Na <a href="/wpt/Programa%C3%A7%C3%A3o_de_computadores" title="Programação de computadores" wx:linktype="known" wx:pagename="Programação_de_computadores" wx:page_id="1417" id="wx65">programação</a> <a href="/wpt/Orienta%C3%A7%C3%A3o_a_objetos" title="Orientação a objetos" wx:linktype="known" wx:pagename="Orientação_a_objetos" wx:page_id="13586" id="wx66">orientada a objetos</a>, o <b id="wx67">polimorfismo</b> permite que referências de tipos de <a href="/wpt/Classe_%28programa%C3%A7%C3%A3o%29" title="Classe (programação)" wx:linktype="known" wx:pagename="Classe_(programação)" wx:page_id="69870" id="wx68">classes</a> mais abstratas representem o comportamento das classes concretas que referenciam. Assim, um mesmo método pode apresentar várias formas, de acordo com seu contexto. O polimorfismo é importante pois permite que a semântica de uma interface seja efetivamente separada da implementação que a representa. O termo polimorfismo é originário do grego e significa "muitas formas" (poli = muitas, morphos = formas).</p>

<div id="wx_toc"/>

<a id="Exemplos" name="Exemplos"/>
<wx:section level="2" title="Exemplos" id="wxsec2"><h2 id="wx69">Exemplos</h2>

<p id="wx70">Suponha a seguinte classe escrita em <a href="/wpt/Java_%28linguagem_de_programa%C3%A7%C3%A3o%29" title="Java (linguagem de programação)" wx:linktype="known" wx:pagename="Java_(linguagem_de_programação)" wx:page_id="1097" id="wx71">Java</a>:</p>

<p id="wx72">&lt;source lang="java"&gt; public abstract class OperacaoMatematica {</p>

<pre id="wx73">
  public abstract double calcular(double x, double y);
</pre>

<p id="wx74">} &lt;/source&gt;</p>

<p id="wx75">Esta é uma classe abstrata que representa qualquer operação matemática. Podemos imaginar diversas operações que se encaixam na sua interface, como soma, subtração, multiplicação ou divisão, entre outras. Note que, mesmo que a natureza do cálculo mude, a semântica do método calcular não muda, ou seja, ele sempre calculará o resultado da operação matemática que está sendo trabalhada.</p>

<p id="wx76">Definamos então, duas subclasses, Soma e Subtracao, que implementam a classe OperacaoMatematica:</p>

<p id="wx77">&lt;source lang="java"&gt; public class Soma extends OperacaoMatematica {</p>

<pre id="wx78">
  public double calcular(double x, double y) {
     return x+y;
  }
</pre>

<p id="wx79">}</p>

<p id="wx80">public class Subtracao extends OperacaoMatematica {</p>

<pre id="wx81">
  public double calcular(double x, double y) {
     return x-y;
  }
</pre>

<p id="wx82">} &lt;/source&gt;</p>

<p id="wx83">O seguinte trecho de código demonstra o uso do polimorfismo:</p>

<p id="wx84">&lt;source lang="java"&gt; public class Contas {</p>

<pre id="wx85">
  public static void mostrarCalculo(OperacaoMatematica operacao, double x, double y) {
      system.out.println("O resultado é: " + operacao.calcular(x, y));
  }
</pre>

<pre id="wx86">
  public static void main(String args[]) {
       //Primeiro calculamos uma soma
       Contas.mostrarCalculo(new Soma(), 5, 5); //Imprime o resultado é: 10
       Contas.mostrarCalculo(new Subtracao(), 5, 5); //Imprime o resultado é: 0
  }
</pre>

<p id="wx87">} &lt;/source&gt;</p>

<p id="wx88">Note que, embora o método calcular tenha sido chamado duas vezes no interior de mostrarCalculo, o comportamento apresentado variou de acordo com a classe ao qual ele representava no momento. É comum definir sobrecarga de métodos ou simplesmente <a href="/wpt/Sobrecarga" title="Sobrecarga" wx:linktype="known" wx:pagename="Sobrecarga" wx:page_id="545222" id="wx89">sobrecarga</a> como uma forma de polimorfismo embora esta definição deixe lacunas conceituais.</p>

<a id="Benef.C3.ADcios_do_polimorfismo" name="Benef.C3.ADcios_do_polimorfismo"/>
</wx:section><wx:section level="2" title="Benefícios do polimorfismo" id="wxsec3"><h2 id="wx90">Benefícios do polimorfismo</h2>

<a id="Clareza_e_manuten.C3.A7.C3.A3o_do_c.C3.B3digo" name="Clareza_e_manuten.C3.A7.C3.A3o_do_c.C3.B3digo"/>
<wx:section level="3" title="Clareza e manutenção do código" id="wxsec7"><h3 id="wx91">Clareza e manutenção do código</h3>

<p id="wx92">Em linguagens de programação não polimórficas, para implementar o método mostrarCalculo, seria necessário recorrer a uma enumeração com o tipo de operação e, dentro do método, testar o valor da enumeração com um case, como no exemplo abaixo:</p>

<p id="wx93">&lt;source lang="java"&gt; public void mostrarCalculo (int operacao, double x, double y) {</p>

<pre id="wx94">
  System.out.print("O resultado é: ");
  switch (operacao) {
    case SOMA: 
       System.out.print(""+(x+y));
       break;
    case SUBTRACAO: 
       System.out.print(""+(x-y));
       break;
    //... outras operacoes
    default: throw new UnsupportedOperationException()
  }
</pre>

<p id="wx95">} &lt;/source&gt;</p>

<p id="wx96">Além do código ser maior e mais difícil de ler, essa implementação tem outros problemas. Provavelmente esse não será o único método a utilizar operações matemáticas e, portanto, pode-se esperar não um, mas vários switchs como esse pelo código. O que acontece, então, se uma nova operação for adicionada ao sistema? Será necessário que todos os switchs sejam encontrados e substituídos. Com o polimorfismo, a modificação restringiria-se apenas a criação de uma nova classe.</p>

<a id="Aplica.C3.A7.C3.B5es_flex.C3.ADveis" name="Aplica.C3.A7.C3.B5es_flex.C3.ADveis"/>
</wx:section><wx:section level="3" title="Aplicações flexíveis" id="wxsec8"><h3 id="wx97">Aplicações flexíveis</h3>

<p id="wx98">O polimorfismo combinado à <a href="/wpt/Reflex%C3%A3o_%28programa%C3%A7%C3%A3o%29" title="Reflexão (programação)" wx:linktype="known" wx:pagename="Reflexão_(programação)" wx:page_id="327774" id="wx99">reflexão</a> permite facilmente a criação de plugins. A aplicação original cria interfaces e classes que tem muito conhecimento semântico, mas a sua implementação efetiva ficará a cargo de terceiros. Uma aplicação gráfica, por exemplo, poderia ser implementada de forma a desenhar linhas, formas e gráficos precisos de acordo com operacões matemáticas fornecidas. Enquanto isso, empresas terceiras, nos diversos campos de sua atuação, implementariam as operações matemáticas específicas para o seu empreendimento (cálculos de órbitas para astronomia, cálculos estruturais para engenharia civil, balística para aeronáutica, etc).</p>

<a id="Polimorfismo_e_padr.C3.B5es_de_projeto" name="Polimorfismo_e_padr.C3.B5es_de_projeto"/>
</wx:section></wx:section><wx:section level="2" title="Polimorfismo e padrões de projeto" id="wxsec4"><h2 id="wx100">Polimorfismo e padrões de projeto</h2>

<p id="wx101">Boa parte dos <a href="/wpt/Padr%C3%B5es_de_projeto_de_software" title="Padrões de projeto de software" wx:linktype="known" wx:pagename="Padrões_de_projeto_de_software" wx:page_id="28790" id="wx102">padrões de projeto de software</a> baseiam-se no uso de polimorfismo, por exemplo: <a href="/wpt/Abstract_Factory" title="Abstract Factory" wx:linktype="known" wx:pagename="Abstract_Factory" wx:page_id="194449" id="wx103">Abstract Factory</a>, <a href="/wpt/Composite" title="Composite" wx:linktype="known" wx:pagename="Composite" wx:page_id="608476" id="wx104">Composite</a>, <a href="/wpt/Observer" title="Observer" wx:linktype="known" wx:pagename="Observer" wx:page_id="343364" id="wx105">Observer</a>, <a href="/wpt/Strategy" title="Strategy" wx:linktype="known" wx:pagename="Strategy" wx:page_id="853068" id="wx106">Strategy</a>, <a href="/wpt/Template_Method" class="new" title="Template Method" wx:linktype="unknown" wx:pagename="Template_Method" id="wx107">Template Method</a>, etc..</p>

<p id="wx108">O polimorfismo também é usado em uma série de <a href="/wpt/Refatora%C3%A7%C3%A3o" title="Refatoração" wx:linktype="known" wx:pagename="Refatoração" wx:page_id="126534" id="wx109">refatorações</a>, como substituir condicional por polimorfismo<sup id="_ref-0" class="reference"><a href="#_note-0" title="" wx:fragment="_note-0" wx:linktype="note" id="wx110"/></sup>.</p>

<wx:template id="wx_t3" pagename="Predefinição:Ref-section" page_id="1467239"/>
<a id="Refer.C3.AAncias" name="Refer.C3.AAncias"/>
</wx:section><wx:section level="2" title="Referências" id="wxsec5"><h2 class="notes" style="cursor:help" title="Esta secção não é editável por razões técnicas. Edite a página toda ao invés disso, ou a secção anterior." id="wx111">Referências</h2>

<div class="references-small" style="height: auto; max-height: 200px; overflow: auto; padding: 3px; border: 1px solid #EEEEEE" id="wx112">
<ol class="references" id="wx113">
<li id="_note-0"><a href="#_ref-0" title="" wx:fragment="_ref-0" wx:linktype="noteref" id="wx114">↑</a> <a href="http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html" class="external free" wx:linktype="external" rel="nofollow" id="wx115">http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html</a></li>
</ol>
</div>

<wx:templateend start="wx_t3"/>
<a id="Ver_tamb.C3.A9m" name="Ver_tamb.C3.A9m"/>
</wx:section><wx:section level="2" title="Ver também" id="wxsec6"><h2 id="wx116"><wx:template id="wx_t4" pagename="Predefinição:Ver_também" page_id="62492"/>Ver também<wx:templateend start="wx_t4"/></h2>

<ul id="wx117">
<li id="wx118"><a href="/wpt/Programa%C3%A7%C3%A3o_orientada_a_objetos" title="Programação orientada a objetos" wx:linktype="known" wx:pagename="Programação_orientada_a_objetos" wx:page_id="125741" id="wx119">Programação orientada a objetos</a></li>

<li id="wx120"><a href="/wpt/UML" title="UML" wx:linktype="known" wx:pagename="UML" wx:page_id="1877" id="wx121">UML</a><a href="http://be-x-old.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BB%D1%96%D0%BC%D0%B0%D1%80%D1%84%D1%96%D0%B7%D0%BC" class="extiw" title="be-x-old:Палімарфізм" wx:linktype="interwiki" wx:pagename="be-x-old:Палімарфізм" id="wx122">be-x-old:Палімарфізм</a></li>
</ul>
</wx:section></wx:section></div>
<div id="wx_categorylinks">
<a href="/wpt/index.php?title=Especial:Categories&amp;article=Polimorfismo" title="Especial:Categories" wx:linktype="known" wx:pagename="Especial:Categories" id="wx123">Categorias de páginas</a>: <span dir="ltr" id="wx124"><a href="/wpt/Categoria:Programa%C3%A7%C3%A3o_orientada_a_objetos" title="Categoria:Programação orientada a objetos" wx:linktype="known" wx:pagename="Categoria:Programação_orientada_a_objetos" wx:page_id="269605" id="wx125">Programação orientada a objetos</a></span></div>
<div id="wx_languagelinks">
Outras línguas: <a href="http://bs.wikipedia.org/wiki/Polimorfizam" class="external" wx:linktype="interwiki" wx:pagename="bs:Polimorfizam" id="wx126">Bosanski</a> | <a href="http://de.wikipedia.org/wiki/Polymorphie_%28Programmierung%29" class="external" wx:linktype="interwiki" wx:pagename="de:Polymorphie_(Programmierung)" id="wx127">Deutsch</a> | <a href="http://en.wikipedia.org/wiki/Type_polymorphism" class="external" wx:linktype="interwiki" wx:pagename="en:Type_polymorphism" id="wx128">English</a> | <a href="http://es.wikipedia.org/wiki/Polimorfismo_%28programaci%C3%B3n_orientada_a_objetos%29" class="external" wx:linktype="interwiki" wx:pagename="es:Polimorfismo_(programación_orientada_a_objetos)" id="wx129">Español</a> | <a href="http://et.wikipedia.org/wiki/Pol%C3%BCmorfism_%28informaatika%29" class="external" wx:linktype="interwiki" wx:pagename="et:Polümorfism_(informaatika)" id="wx130">Eesti</a> | <a href="http://fr.wikipedia.org/wiki/Polymorphisme_%28informatique%29" class="external" wx:linktype="interwiki" wx:pagename="fr:Polymorphisme_(informatique)" id="wx131">Français</a> | <a href="http://he.wikipedia.org/wiki/%D7%A4%D7%95%D7%9C%D7%99%D7%9E%D7%95%D7%A8%D7%A4%D7%99%D7%96%D7%9D_%28%D7%AA%D7%95%D7%9B%D7%A0%D7%94%29" class="external" wx:linktype="interwiki" wx:pagename="he:פולימורפיזם_(תוכנה)" id="wx132">עברית</a> | <a href="http://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0" class="external" wx:linktype="interwiki" wx:pagename="ja:ポリモーフィズム" id="wx133">日本語</a> | <a href="http://lt.wikipedia.org/wiki/Polimorfizmas_%28programavime%29" class="external" wx:linktype="interwiki" wx:pagename="lt:Polimorfizmas_(programavime)" id="wx134">Lietuvių</a> | <a href="http://nl.wikipedia.org/wiki/Polymorfisme_%28informatica%29" class="external" wx:linktype="interwiki" wx:pagename="nl:Polymorfisme_(informatica)" id="wx135">Nederlands</a> | <a href="http://pl.wikipedia.org/wiki/Polimorfizm_%28informatyka%29" class="external" wx:linktype="interwiki" wx:pagename="pl:Polimorfizm_(informatyka)" id="wx136">Polski</a> | <a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_%D0%B2_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0%D1%85_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F" class="external" wx:linktype="interwiki" wx:pagename="ru:Полиморфизм_в_языках_программирования" id="wx137">Русский</a> | <a href="http://uk.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D1%96%D0%BC%D0%BE%D1%80%D1%84%D1%96%D0%B7%D0%BC_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F%29" class="external" wx:linktype="interwiki" wx:pagename="uk:Поліморфізм_(програмування)" id="wx138">Українська</a></div>
</body>
<wx:templatearguments for="wx_t1"><wx:argument name="2">
<p id="wx139">Polimorfismo (desambiguação)</p>
</wx:argument></wx:templatearguments>
<wx:templatearguments for="wx_t2"><wx:argument name="2">
<p id="wx140">Polimorfismo (desambiguação)</p>
</wx:argument></wx:templatearguments>
<wx:templatearguments for="wx_t3"><wx:argument name="2">
<p id="wx141">Polimorfismo (desambiguação)</p>
</wx:argument></wx:templatearguments>
<wx:templatearguments for="wx_t4"><wx:argument name="2">
<p id="wx142">Polimorfismo (desambiguação)</p>
</wx:argument></wx:templatearguments>
</html>
