Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Layo

Programação orientada a objeto

Recommended Posts

Boa noite galera beleza ??

 

Alguem tem um exemplo bem simples de polimorfismo do php ? estou começando a estudar o (POO) e nao consegui entender............. a herança OK consegui ... queria algo mais básico possivel apenas para entender como se usa com echo por exemplo bem básico..

Compartilhar este post


Link para o post
Compartilhar em outros sites
Polimorfismo é a capacidade de um mesmo objeto de se comportar de diversas formas diferentes ou de objetos totalmente diferentes se comportarem de forma igual.

 

Palavras de João Neto o cara que tem uma didática muito boa através dos tutoriais na Imasters

 

http://forum.imasters.com.br/forum/159-curso-de-php/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao eu li o do joao e achei muito bom a didatica... com base no tutorial eu fiz um sera q eh isso utilizando o Nome 2 vezes ? isso eh o polimorfismo ?

 

class Pai {
  public $nome;
  public $olhos;
}

class Filho extends Pai {
  public $carro;
}

$pai = new Pai;
$pai->Nome = "Layo"; // nome
$pai->Olhos = "azul";
$pai->Carro = "golf";

$filho = New Filho;
$filho->Nome = "marcos"; // nome

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei explicar, mas fiz um pequenos exemplo bem básico, que depois que ler os posts do João, entenderá facilmente. Ou que alguém do fórum te explique, pois explicar coisas não é comigo:

<?php
interface Nomes{
public function DefineNome(Idades $Idade);
}

/* Nomes */
class Joao implements Nomes{
public function DefineNome(Idades $Idade){
return "João";
}
}

class Gabriel implements Nomes{
public function DefineNome(Idades $Idade){
return "Gabriel";
}
}
/* Fim Nomes */

/*Idades*/
interface Idades{
public function Idade(Nomes $Nome);
}

class idade13 implements Idades{
public function Idade(Nomes $Nome){
return "13 anos";
}
}

class idade15 implements Idades{
public function Idade(Nomes $Nome){
return "15 anos";
}
}
/* Fim Idades */

/* Entregar os dados da pessoa à alguém */
class EntregarOsDados{
public function Entregar($Nome, $Idade){
echo "O usuário ".$Nome->DefineNome($Idade);
echo "<br />";
echo "Ele tem ".$Idade->Idade($Nome);
}
}
/* Fim [entregar] */
/* Fim da parte das classes */

$gabriel = new Gabriel();
$joao = new Joao();

$anos13 = new idade13();
$anos15 = new idade15();

$entregar = new EntregarOsDados();
$entregar->Entregar($gabriel, $anos13);
/* Demos o nome: Gabriel a uma pessoa de 13 anos. */

 

Entao eu li o do joao e achei muito bom a didatica... com base no tutorial eu fiz um sera q eh isso utilizando o Nome 2 vezes ? isso eh o polimorfismo ?

 

class Pai {
  public $nome;
  public $olhos;
}

class Filho extends Pai {
  public $carro;
}

$pai = new Pai;
$pai->Nome = "Layo"; // nome
$pai->Olhos = "azul";
$pai->Carro = "golf";

$filho = New Filho;
$filho->Nome = "marcos"; // nome

Não, isto é apenas métodos de herança.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara eu também penei de mais para aprender e mesmo aplicando tenho minhas dúvidas que vão se resolver ao longo do tempo e necessidade mas o básico creio que saberei falar o que é.

 

Quando ele diz do mesmo objeto se comportando de mais de um modo eu vou tentar dar um exemplo teórico:

 

você tem o seu objeto veiculo por exemplo

 

um veiculo pode ser várias coisas então ao invés de você amarrar o seu código fazendo objeto Carro, Objeto Moto você simplesmente cria interfaces com métodos definidos e então quando uma pessoa precisar fazer um veiculo ela terá que implementar o veiculo que ela quer assim sendo "obrigada" a utilizar de seu métodos já definidos em sua interface.

 

não leve a palavra "obrigada" como algo que vai amarrar o seu código pois é justamente o oposto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Layo, herança é basicamente isto ai mesmo, pois a subclasse (Filho) herda as propriedades $nome e $olhos da superclasse (Pai). Com herança você pode usar propriedades e métodos já implementados na superclasse.

Porém aonde você diz:

$pai = new Pai;
...
$pai->Carro = "golf"

está errado pois a classe Pai que é a superclasse não possui a propriedade $carro, está propriedade foi implementado apenas na classe Filho que é subclasse. Isto é o filho vai ter características do Pai, mas o Pai não vai ter características que o Filho gerou ao longo da vida.

 

ps.: se você declara uma propriedade com letra minúscula (public $nome;)você deve utilizar da mesma forma ($pai->nome).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pegando o exemplo teórico do Vinicius... um exemplo prático:

 

<?php
interface Veiculo { 
 public function getModelo();
 public function setModelo($modelo);
}

class Moto implements Veiculo {
 private $modelo;

 public function __construct($modelo){
   $this->setModelo($modelo);
 }  

 public function getModelo(){
   return $this->modelo;
 }

 public function setModelo($modelo){
   $this->modelo = $modelo;
 }  
}

class Carro implements Veiculo {
 private $modelo;

 public function __construct($modelo){
   $this->setModelo($modelo);
 }  

 public function getModelo(){
   return $this->modelo;
 }

 public function setModelo($modelo){
   $this->modelo = $modelo;
 }  
}

class Garagem {
 private $listaveiculo = array();

 public function addVeiculo(Veiculo $veiculo){
   $this->listaveiculo[] = $veiculo;
 }

 public function getListaVeiculo() {
return $this->listaveiculo;
 }
}

$garagem = new Garagem();
$garagem->addVeiculo(new Carro("VW Gol G4"));
$garagem->addVeiculo(new Carro("Ford Focus"));
$garagem->addVeiculo(new Moto("Honda CBR 600"));
$garagem->addVeiculo(new Carro("Ford Fiesta"));
$garagem->addVeiculo(new Carro("Ford Ecosport"));
$garagem->addVeiculo(new Carro("VW Gol G4"));
$garagem->addVeiculo(new Moto("Yamaha R1"));
$garagem->addVeiculo(new Carro("VW Gol G4"));
$garagem->addVeiculo(new Carro("VW Polo"));
$garagem->addVeiculo(new Moto("Honda CBR 600"));

print_r($garagem->getListaVeiculo());
?>

 

Se você extender a funcionalidade da sua garagem para estacionar outros Veículos, você cria a classe, sei lá, por exemplo, Caminhao() e implementa a interface Veiculo(), pronto... sua classe Garagem já pode estacionar caminhões. Rs

 

Não esquecendo de seguir a "assinatura" da interface.

class Caminhao implements Veiculo {
 private $modelo;
 private $carregado;

 public function __construct($modelo){
   $this->setModelo($modelo);
 }  

 public function getModelo(){
   return $this->modelo;
 }

 public function setModelo($modelo){
   $this->modelo = $modelo;
 }  

 public function isCarregado(){
   return $this->carregado;
 }

 public function setCarregado($carregado){
   $this->carregado = $carregado;
 }  
}

 

Bons estudos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia galera ??? primeiramente obrigado pelas respostas muito boas...

 

Gabriel Jacinto - Cara muito obrigado ficou bem claro com o seu codigo, uma coisa que reparei q para um unico objeto se comportar diversas formas diferentes temos sempre q usar o interface e implements ? existe alguma forma sem usar os 2 ?

 

Vinicius Rangel / Prog - Obrigado os 2 a ideia da garagem foi bem legal tambem surgiu a mesma duvida da de cima ...

 

Leonardo Leal - Obrigado pela ajuda, cara acho entao q nao entendi herança muito bem:

 

class Pai {
  public $Nome;
  public $Olhos;
}

class Filho extends Pai {
  public $Carro;
}

$pai = new Pai;
$pai->Nome = "Layo"; // nome
$pai->Olhos = "azul";
$pai->Carro = "golf";

 

O carro ele foi criado no filho entao nao poderia acontecer isso ? qual é entao a ideia da herança seguindo esse exemplo como eu faria uma herança ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É ao contrário...

 

$filho = new Filho();
$filho->Nome = "Layo"; // nome
$filho->Olhos = "azul";
$filho->Carro = "golf";

 

O filho herda (extende) as características do pai (superclasse).

Compartilhar este post


Link para o post
Compartilhar em outros sites

O carro ele foi criado no filho entao nao poderia acontecer isso ? qual é entao a ideia da herança seguindo esse exemplo como eu faria uma herança ?

class Pai {
  public $Nome;
  public $Olhos = "azul";
}

class Filho extends Pai {
  public $Carro;
}

$pai = new Pai();
$pai->Nome = "Layo"; // nome

echo $pai->Nome; //Layo
echo $pai->Olhos; //Azuis
echo $pai->Carro; //ERRO pois a propriedade não existe na classe pai e sim na filho

$filho = new Filho();
$filho->Nome = "Pedro";
$filho->Carro = "golf";

echo $filho->Nome; //Pedro
echo $filho->Olhos; //Azuis
echo $filho->Carro; //golf

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera agora sim entendi a herança !!! rsrs obrigado... desculpe se demorei para compreender mais estou começando a entrar nesse mundo de orientação a objeto agora...

 

Ficou mais uma duvida o polimorfismo so ira funcionar com:

 

interface 

implements

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera agora sim entendi a herança !!! rsrs obrigado... desculpe se demorei para compreender mais estou começando a entrar nesse mundo de orientação a objeto agora...

 

Ficou mais uma duvida o polimorfismo so ira funcionar com:

 

interface 

implements

Bem, segundo o manual do PHP, diz que é possível por herança:

Interfaces podem ser estendidas como classes, usando o operador extends.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo do amigo Leornado:

 

class Pai {
  public $Nome;
  public $Olhos = "azul";
}

class Filho extends Pai {
  public $Carro;
}

$pai = new Pai();
$pai->Nome = "Layo"; // nome

echo $pai->Nome; //Layo
echo $pai->Olhos; //Azuis
echo $pai->Carro; //ERRO pois a propriedade não existe na classe pai e sim na filho

$filho = new Filho();
$filho->Nome = "Pedro";
$filho->Carro = "golf";

echo $filho->Nome; //Pedro
echo $filho->Olhos; //Azuis
echo $filho->Carro; //golf

 

veja que na Classe pai ele definiu a propriedade Olhos e por padrão ele é azul.

 

acontece que a classe filho não tem essa propriedade e a partir do momento que ele usou o extends ele passou a herdar propriedades e até métodos se tivesse.

 

então quando ele criar um Objeto filho ele pode usar das propriedades do pai sem precisar ter no seu escopo ou até mesmo sem ter instanciado o Objeto Pai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.