Duvida sobre poliformismo

11 respostas
carlosaandrade

Olá

Tive uma aula hj sobre poliformismo e acabei não entendo o conceito…vocês podem me ajudar??

eu pesquisei na net, mais é muito técnico e se puderem postar um exemplinho basico já iria me ajudar.:smiley:

desde já agradeço a ajuda!!

11 Respostas

W

Polimorfismo, significa muitas formas.

Na prática, você pode herdar uma classe Pai para gerar Filho. Ex.: public class Filho extends Pai {…}.

Como há herança, você pode praticar o polimosfimo mais ou menos assim:

Pai p = new Pai();
System.out.println(p.getNome());

// Resultado: Nome do pai

p = new Filho();
System.out.println(p.getNome());

// Resultado: Nome do filho

Filho f = (Filho) p;
System.out.println(f.getNome());

// Resultado: Nome do filho

p = f;
System.out.println(p.getNome());

Para mais, é melhor pesquisar sobre herança e polimorfismos em O.O.

wiliamps

drsmachado
wiliamps:
Polimorfismo, significa muitas formas.

Na prática, você pode herdar uma classe Pai para gerar Filho. Ex.: public class Filho extends Pai {...}.

Como há herança, você pode praticar o polimosfimo mais ou menos assim:

Pai p = new Pai();
System.out.println(p.getNome());

// Resultado: Nome do pai

p = new Filho();
System.out.println(p.getNome());

// Resultado: Nome do filho

Filho f = (Filho) p;
System.out.println(f.getNome());

// Resultado: Nome do filho

p = f;
System.out.println(p.getNome());

Para mais, é melhor pesquisar sobre herança e polimorfismos em O.O.

wiliamps
http://oracle2java.blogspot.com.br/


Pelo menos use a tag [code] para formatar as respostas com código. Coisa mais horrível de se ler...

drsmachado

Poli = Muitos
Morfos = formas.

O conceito de polimorfismo está implicitamente ligado ao de herança, o que, na prática, não é todo errado, porém, esquecemos que existe, ainda, a relação de implementação.

Vamos aos casos.
Considere a classe FiguraGeometrica. Como sabemos, toda figura geométrica possui uma área e um perímetro. A forma de calcular a área de uma figura varia de acordo com o tipo de figura que temos.

public class FiguraGeometrica{
   public float calcularArea(){
     return 0;
   }

   public float calcularPerimetro(){
    return 0;
  }
}

Um quadrado é uma figura geométrica. Logo, podemos dizer que ele estende a figura geométrica.
A área do quadrado é determinada pela equação l² e seu perímetro pela equação l * 4

public class Quadrado extends FiguraGeometrica{
   private float lado;
   public Quadrado(float lado){
    super();
    this.lado = lado;
   }

   @Override
   public float calcularArea(){
    return lado*lado;
   }

   @Override
   public float calcularPerimetro(){
     return 4 * lado;
   }
}

Um círculo também é uma figura geométrica, cujo cálculo da área depende de pi (cujo valor aproximado é 3,141516) e tem a equação pi * raio² e cujo perímetro (circunferência) é calculado com 2 * pi * raio.

public class Circulo extends FiguraGeometrica{
   private static final float PI = 3.141516F;
   private float raio;
   public Quadrado(float raio){
    super();
    this.raio = raio;
   }

   @Override
   public float calcularArea(){
    return PI * (raio * raio);
   }

   @Override
   public float calcularPerimetro(){
     return 2 * PI * raio;
   }
}

Viu?
Como os métodos calcularArea e calcularPerimetro são herdados por circulo e quadrado, mas possuem implementações diferentes, chamamos de polimorfismo.
Porém, temos uma outra forma de polimorfismo, mais inteligente e abrangente, que é com a implementação.

Considere a classe Pessoa.Toda pessoa possui um nome e pode fazer diversas coisas ao longo da vida. Uma delas é ser estudante.Como estudante, uma pessoa pode cursar o ensino fundamental, médio, superior ou ir além disso. Ainda como estudante, ela deverá realizar provas a fim de ser aprovada.
Podemos dizer que estudante é uma interface que modifica as características de uma pessoa.

public interface Estudante{
  public void informaSerie();
  public boolean vaiBemNaProva();
}

E a classe Pessoa

public class Pessoa{
  public String nome;
  //getters e setters de nome
}

E a implementação de Estudante, quando no ensino médio

public class EstudanteSecundarista extends Pessoa implements Estudante {
   public boolean bomAluno;

   public EstudanteSecundarista(boolean bomAluno){
     this.bomAluno = bomAluno;
   }

   @Override
   public void informaSerie(){
    System.out.println("1° ao 3° ano do ensino médio");
   }

   @Override
   public boolean vaiBemNaProva(){
     return bomAluno == true ? true : false;
   }
}

E também podemos ter o estudante de graduação

public class Graduando extends Pessoa implements Estudante {
	private boolean bomAluno;
	private boolean cola;
	public Graduando(boolean bomAluno, boolean cola){
		this.bomAluno = bomAluno;
		this.cola = cola;
	}
	
	@Override
	public void informaSerie(){
    System.out.println("Em algum lugar do curso superior");
   }

   @Override
   public boolean vaiBemNaProva(){
		if(bomAluno || cola){
			return true;
		}
		return false;
   }
}

Perceba que eu consigo ser mais abrangente quando utilizo uma interface e, mesmo assim, consigo utilizar polimorfismo.

Ficou claro agora?

W
Pelo menos use a tag [code] para formatar as respostas com código. Coisa mais horrível de se ler...

Você tem razão. Minha resposta deu algum problema no post, pois tinha feito tudo certo.

Desta vez, foi mal galera.

S

Uma vez postaram esse link aqui no forum:

Veja se isso responde a sua pergunta.

Eu achei ele muito bom.

Aleksandro

drsmachado:
Poli = Muitos
Morfos = formas.

O conceito de polimorfismo está implicitamente ligado ao de herança, o que, na prática, não é todo errado, porém, esquecemos que existe, ainda, a relação de implementação.

Vamos aos casos.
Considere a classe FiguraGeometrica. Como sabemos, toda figura geométrica possui uma área e um perímetro. A forma de calcular a área de uma figura varia de acordo com o tipo de figura que temos.

public class FiguraGeometrica{
   public float calcularArea(){
     return 0;
   }

   public float calcularPerimetro(){
    return 0;
  }
}

Um quadrado é uma figura geométrica. Logo, podemos dizer que ele estende a figura geométrica.
A área do quadrado é determinada pela equação l² e seu perímetro pela equação l * 4

public class Quadrado extends FiguraGeometrica{
   private float lado;
   public Quadrado(float lado){
    super();
    this.lado = lado;
   }

   @Override
   public float calcularArea(){
    return lado*lado;
   }

   @Override
   public float calcularPerimetro(){
     return 4 * lado;
   }
}

Um círculo também é uma figura geométrica, cujo cálculo da área depende de pi (cujo valor aproximado é 3,141516) e tem a equação pi * raio² e cujo perímetro (circunferência) é calculado com 2 * pi * raio.

public class Circulo extends FiguraGeometrica{
   private static final float PI = 3.141516F;
   private float raio;
   public Quadrado(float raio){
    super();
    this.raio = raio;
   }

   @Override
   public float calcularArea(){
    return PI * (raio * raio);
   }

   @Override
   public float calcularPerimetro(){
     return 2 * PI * raio;
   }
}

Viu?
Como os métodos calcularArea e calcularPerimetro são herdados por circulo e quadrado, mas possuem implementações diferentes, chamamos de polimorfismo.
Porém, temos uma outra forma de polimorfismo, mais inteligente e abrangente, que é com a implementação.

Considere a classe Pessoa.Toda pessoa possui um nome e pode fazer diversas coisas ao longo da vida. Uma delas é ser estudante.Como estudante, uma pessoa pode cursar o ensino fundamental, médio, superior ou ir além disso. Ainda como estudante, ela deverá realizar provas a fim de ser aprovada.
Podemos dizer que estudante é uma interface que modifica as características de uma pessoa.

public interface Estudante{
  public void informaSerie();
  public boolean vaiBemNaProva();
}

E a classe Pessoa

public class Pessoa{
  public String nome;
  //getters e setters de nome
}

E a implementação de Estudante, quando no ensino médio

public class EstudanteSecundarista extends Pessoa implements Estudante {
   public boolean bomAluno;

   public EstudanteSecundarista(boolean bomAluno){
     this.bomAluno = bomAluno;
   }

   @Override
   public void informaSerie(){
    System.out.println("1° ao 3° ano do ensino médio");
   }

   @Override
   public boolean vaiBemNaProva(){
     return bomAluno == true ? true : false;
   }
}

E também podemos ter o estudante de graduação

public class Graduando extends Pessoa implements Estudante {
	private boolean bomAluno;
	private boolean cola;
	public Graduando(boolean bomAluno, boolean cola){
		this.bomAluno = bomAluno;
		this.cola = cola;
	}
	
	@Override
	public void informaSerie(){
    System.out.println("Em algum lugar do curso superior");
   }

   @Override
   public boolean vaiBemNaProva(){
		if(bomAluno || cola){
			return true;
		}
		return false;
   }
}

Perceba que eu consigo ser mais abrangente quando utilizo uma interface e, mesmo assim, consigo utilizar polimorfismo.

Ficou claro agora?

drsmachado

Excelente resposta, parabéns … para se aprofundar nos exemplos sobre implementação, aconselho a dar uma olhada em alguns blogs publicados no site do caelum, iria colocar o link aqui , mas no meu trampo estão bloqueando o acesso … valeu…

carlosaandrade

drsmachado:
Poli = Muitos
Morfos = formas.

O conceito de polimorfismo está implicitamente ligado ao de herança, o que, na prática, não é todo errado, porém, esquecemos que existe, ainda, a relação de implementação.

Vamos aos casos.
Considere a classe FiguraGeometrica. Como sabemos, toda figura geométrica possui uma área e um perímetro. A forma de calcular a área de uma figura varia de acordo com o tipo de figura que temos.

public class FiguraGeometrica{
   public float calcularArea(){
     return 0;
   }

   public float calcularPerimetro(){
    return 0;
  }
}

Um quadrado é uma figura geométrica. Logo, podemos dizer que ele estende a figura geométrica.
A área do quadrado é determinada pela equação l² e seu perímetro pela equação l * 4

public class Quadrado extends FiguraGeometrica{
   private float lado;
   public Quadrado(float lado){
    super();
    this.lado = lado;
   }

   @Override
   public float calcularArea(){
    return lado*lado;
   }

   @Override
   public float calcularPerimetro(){
     return 4 * lado;
   }
}

Um círculo também é uma figura geométrica, cujo cálculo da área depende de pi (cujo valor aproximado é 3,141516) e tem a equação pi * raio² e cujo perímetro (circunferência) é calculado com 2 * pi * raio.

public class Circulo extends FiguraGeometrica{
   private static final float PI = 3.141516F;
   private float raio;
   public Quadrado(float raio){
    super();
    this.raio = raio;
   }

   @Override
   public float calcularArea(){
    return PI * (raio * raio);
   }

   @Override
   public float calcularPerimetro(){
     return 2 * PI * raio;
   }
}

Viu?
Como os métodos calcularArea e calcularPerimetro são herdados por circulo e quadrado, mas possuem implementações diferentes, chamamos de polimorfismo.
Porém, temos uma outra forma de polimorfismo, mais inteligente e abrangente, que é com a implementação.

Considere a classe Pessoa.Toda pessoa possui um nome e pode fazer diversas coisas ao longo da vida. Uma delas é ser estudante.Como estudante, uma pessoa pode cursar o ensino fundamental, médio, superior ou ir além disso. Ainda como estudante, ela deverá realizar provas a fim de ser aprovada.
Podemos dizer que estudante é uma interface que modifica as características de uma pessoa.

public interface Estudante{
  public void informaSerie();
  public boolean vaiBemNaProva();
}

E a classe Pessoa

public class Pessoa{
  public String nome;
  //getters e setters de nome
}

E a implementação de Estudante, quando no ensino médio

public class EstudanteSecundarista extends Pessoa implements Estudante {
   public boolean bomAluno;

   public EstudanteSecundarista(boolean bomAluno){
     this.bomAluno = bomAluno;
   }

   @Override
   public void informaSerie(){
    System.out.println("1° ao 3° ano do ensino médio");
   }

   @Override
   public boolean vaiBemNaProva(){
     return bomAluno == true ? true : false;
   }
}

E também podemos ter o estudante de graduação

public class Graduando extends Pessoa implements Estudante {
	private boolean bomAluno;
	private boolean cola;
	public Graduando(boolean bomAluno, boolean cola){
		this.bomAluno = bomAluno;
		this.cola = cola;
	}
	
	@Override
	public void informaSerie(){
    System.out.println("Em algum lugar do curso superior");
   }

   @Override
   public boolean vaiBemNaProva(){
		if(bomAluno || cola){
			return true;
		}
		return false;
   }
}

Perceba que eu consigo ser mais abrangente quando utilizo uma interface e, mesmo assim, consigo utilizar polimorfismo.

Ficou claro agora?

Cara muito boa sua AULA, parabens entendi perfeitamente…muito obrigado drsmachado

Abs :stuck_out_tongue:

douglaskd

a titulo de curiosidade, não tem a ver com o tópico...

public boolean vaiBemNaProva(){   
     return bomAluno == true ? true : false; 
} 

public boolean vaiBemNaProva(){   
        if(bomAluno || cola){   
            return true;   
        }   
        return false;   
}

da pra se fazer assim... fica mais limpinho

public boolean vaiBemNaProva(){   
     return bomAluno;   
} 
    
public boolean vaiBemNaProva(){   
     return (bomAluno || cola);
}
douglaskd

faltou a parte polimorfica:

public class Polimorfismo {
    
   public void poliArgumento(Estudante e){ //recebo uma interface

       //o java automaticamente descobre qual a classe implementou a interface
       //executa cada método de acordo com a classe especifica. de forma polimorfica
              
        e.informaSerie(); // PoliMétodo

       if(e.vaiBemNaProva()){ // PoliMétodo
            System.out.println("sim");
       }
       else { 
           System.out.println("não"); 
       };
    }
    
}

e o teste:

public class TestClass {
    public static void main(String args[]) {
    
    //estou criando 2 objetos usando como tipo a interface Estudante
    //na hora da criação eu coloco qual vai ser o tipo especifico da Classe.
        
    Estudante graduando = new Graduando(false,false);
    
    Estudante estudante = new EstudanteSecundarista(true);
        
    Polimorfismo poli = new Polimorfismo();
    
    //estou passando 2 objetos de tipos distintos 
    //porém que são aceitos pois implementam a mesma interface
    
    poli.poliArgumento(graduando);
    poli.poliArgumento(estudante);
    
    }
}
Rodrigo_Sasaki
douglaskd:
a titulo de curiosidade, não tem a ver com o tópico...
public boolean vaiBemNaProva(){   
     return bomAluno == true ? true : false; 
} 

public boolean vaiBemNaProva(){   
        if(bomAluno || cola){   
            return true;   
        }   
        return false;   
}

da pra se fazer assim... fica mais limpinho

public boolean vaiBemNaProva(){   
     return bomAluno;   
} 
    
public boolean vaiBemNaProva(){   
     return (bomAluno || cola);
}
Não querendo te contradizer, o que você disse está correto.

É que como alguns sabem o drsmachado também dá aula, e como ele deve ter visto, um código como o seu pode confundir muito a cabeça dos alunos.

Pra quem está querendo aprender e entender, quanto mais detalhado melhor :)

douglaskd
digaoneves:
douglaskd:
a titulo de curiosidade, não tem a ver com o tópico...
public boolean vaiBemNaProva(){   
     return bomAluno == true ? true : false; 
} 

public boolean vaiBemNaProva(){   
        if(bomAluno || cola){   
            return true;   
        }   
        return false;   
}

da pra se fazer assim... fica mais limpinho

public boolean vaiBemNaProva(){   
     return bomAluno;   
} 
    
public boolean vaiBemNaProva(){   
     return (bomAluno || cola);
}
Não querendo te contradizer, o que você disse está correto.

É que como alguns sabem o drsmachado também dá aula, e como ele deve ter visto, um código como o seu pode confundir muito a cabeça dos alunos.

Pra quem está querendo aprender e entender, quanto mais detalhado melhor :)

ele esta certo.

foi apenas a título de curiosidade.

Criado 4 de outubro de 2012
Ultima resposta 9 de out. de 2012
Respostas 11
Participantes 7