Ir para conteúdo

POWERED BY:

Arquivado

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

João Batista Neto

1.4.1 Métodos de Interface e Polimorfismo

Recommended Posts

  Citar

Will, entenda que não há um objeto do tipo projétil interfaces em OOP descrevem comportamento. Nós passamos um objeto que se comporte como um projétil.

eu ? Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

João estou acompanhando seus artigos e estou achando fantastico, vou recomendar para alguns professores que eu tenho na faculdade, com uma didática muito ruim com exemplos sem nexos e quem ninguém entende nada. Bom, depois desse desabafo, gostária que você me esplicasse como você invocou os métodos atira da classe eu, pois não consegui entender sua chamada, porque na primeira implementação ela ficou restrita apenas na classe gato e quando faço a instanciação pelo menos com gato funciona, mas com as outras não, gostária se possível desse este exemplo, pois percorri as discussões e vi várias dúvidas sobre isso e desde já agradeço muito, finalmente estou entendo a importância da herança e do polimorfismo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agradeço o João pelo maravilhoso artigo, aprendendo muito com ela.

 

Agora vou tentar resolver sua dúvida Rogério Lopes...

 

No início do artigo não havia interfaces e só existia um Alvo, que era o Gato, mais abaixo foi criado a interface Alvo e implementamos ela em todas as classes alvos, inclusive Gato.

Começamos criar vário alvos e implementar a interface Alvo neles só que aí ficou um problema o método atirar ainda continua aceitando apenas Gato.

 

A princípio tínhamos a classe atirar dessa forma:

public function atira( Pau $pau , Gato $gato ) {
   $gato->acerta( $pau );
}

Então beleza, se eu fizer:

$eu->atira($pau, $gato);

vai funcionar certo? Pois o método atirar aceita Gato.

 

E se eu quiser fazer isso?

$eu->atira($pau, $cao);

 

Não irá funcionar pois o segundo parâmetro do método atirar aceita apenas Gato.

 

Você concorda comigo que Cao e Gato são alvos e implementam a interface Alvo?

Então se eu mudar no método acertar colocar Alvo ao invés de Gato vai funcionar?

Sim!

 

Então fica assim:

public function atira(Projetil $projetil, Alvo $alvo) {
   $gato->acerta($pau);
}

PS: Essa explicação sobre o Alvo também serve para o Projetil, pois todos os projéteis implementam a interface Projetil.

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parabéns João! Ótima didática.

 

Uma coisa que achei interessante, e que acredito nunca ter presenciado, era definir um "tipo" numa interface vazia.

 

Isso é muito louco!

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aí João e Galera!

 

Bela sequência de artigos sobre Polimorfismo, João Bastista.... e bastane enriquecida pelas discussões subsequentes...

 

No entanto, tenho duas situações que, dependendo da combinação, terá que disparar um e-mail entre 4 possíveis (atualmente), de acordo os 2 arrays abaixo. Eles refletem os respectivos campos Enum() no BD.

$aptoEmitirParecer = ['Sim','Nao. Relatar conflito de interesse'];

$situacao = ['Aprovado','Corrigir e/ou Complementar','Reprovado'];

Gostaria de saber se a melhor abordagem seria tratá-la através de Polimorfismo ao invés dos switchs aninhados.

 

A solução mais simples que cheguei foi:

 

switch ($apto) {
    case 'Nao. Relatar conflito de interesse':

        // envia e-mail de conflito de interesse
        break;

    case 'Sim':
        switch ($situacao) {
            case 'Aprovado':

                // envia e-mail de Aprovação
                break;

            case 'Corrigir e/ou Complementar':

                // envia e-mail de Corrção e/ou Complementação
                break;

            case 'Reprovado':

                // envia e-mail de Reprovação
                break;
        }
}

O que vocês me dizem: dá pra refatorar os switchs com Polimorfismo? Que sugestão de implementação me dariam?

 

Grato desde já agradeço pela contribuição de vocês

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.