Polimorfismo ou Sobrecarga ?
Esta semana circulou em nosso grupo uma discussão sobre as diferenças entre polimorfismo e sobrecarga. Muitos acreditam que para haver polimorfismo é necessário haver sobrecarga. Este texto esclarece um pouco a diferença entre estes dois conceitos da orientação a objetos.
Polimorfismo é um recurso que permite dados de diferentes tipos (objetos de diferentes classes) serem tratados por uma interface uniforme. Um método polimórfico pode ser aplicado à objetos de diferentes tipos (classes), sendo que estas classes podem ser representadas por uma estrutura hierárquica.
http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
Sobrecarga é um recurso que permite a criação de diversos métodos com o mesmo nome, que podem diferir uns dos outros em função do tipo de dados de entrada (parâmetros) e da saída do método. Sobrecarga não deve ser confundida com polimorfismo.
http://en.wikipedia.org/wiki/Method_overloading
O exemplo de nosso colega Victor Mauricio Gomes a seguir, tem uma estrutura de herança. Para que o polimorfismo apareça de forma mais contundente, seria interessante criar uma interface única, por exemplo uma outra classe chamada CestaDeCompras para adicionar itens à uma cesta de compras ou uma classe Pedido para fechar o pedido, sendo que esta classe ofereceria um método chamado adicionaProduto(Produto $produto) que internamente iria chamar o método despachar() do objeto recebido como parâmetro, não interessando qual o seu tipo. Neste caso, seria interessante usar um type hinting para restringir os tipos de parâmetros (classes) à classe Produto. Desta forma, o método poderia receber qualquer tipo de objeto, desde que ele seja sub-classe de Produto, configurando um polimorfismo ad-hoc. Neste caso, o polimorfismo reside na diferença de comportamento entre os objetos da mesma hierarquia, neste caso, os objetos podem ser CD's, Eletrodomésticos, etc....
Este comportamento fica bem claro quando rodamos um foreach sobre um array objetos da classe Produto, seja CDs ou Eletrodomésticos. Neste caso, dentro do foreach, podemos chamar um método em comum, como o despachar, sendo que para cada objeto, ele terá um comportamento diferente, apesar de serem da mesma hierarquia.
O principal uso do polimorfismo na orientação a objetos reside em permitir que objetos pertencentes à diferentes tipos (classes), respondam à um mesmo método, sendo que cada chamada é realizada de acordo com o comportamento do tipo específico (classe). O programador não precisa saber previamente qual será o tipo de objeto que irá executar o método, o comportamento é definido em tempo de execução (dynamic binding).
http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
Os diferentes objetos envolvidos precisam compartilhar uma interface única. O método a ser chamado deve estar presente em todas superclasses, subclasses ou interfaces. Em princípio as classes não precisam ser necessariamente relacionadas (hierarquia), mas devem compartilhar uma interface única, podendo ser implementadas na forma de subclasses de uma mesma classe.
Polimorfismo não é o mesmo que sobrecarga de método (method overloading). Polimorfismo está relacionado com a aplicação de uma implementação à uma interface ou à uma classe base. Sobrecarga refere-se à métodos que possuem o mesmo nome, mas diferentes assinaturas dentro da mesma classe. E sobreescrita (method overriding) acontece quando uma subclasse substitui o comportamento (implementação) de um ou mais métodos de sua classe pai. Nem sobrecarga, nem sobreescrita são implementações do polimorfismo.
<?php
/**
* classe Produto
*/
abstract class Produto
{
public $produto;
public $preco;
public $quantidade;
public function Comprar()
{
//
}
protected abstract function Despachar();
}
/**
* classe Eletrodomestico
*/
class Eletrodomestico extends Produto
{
public $cor;
public $marca;
public $modelo;
public function Despachar()
{
echo "Despachando produto.<br />\r\n";
echo "Despachando eletrodoméstico através da TRANSPORTADORA.<br /><br />\r\n\r\n";
}
}
/**
* classe CD
*/
class CD extends Produto
{
public $artista;
public $album;
public $gravadora;
public function Despachar()
{
echo "Despachando produto.<br />\r\n";
echo "Despachando um CD por SEDEX dos correios.<br /><br />\r\n\r\n";
}
}
/*
* Executando o exemplo de polimorfismo
*/
$item = new CD();
$item->Despachar();
$item2 = new Eletrodomestico();
$item2->Despachar();
?>









