Problema com polimorfismo

3 respostas
S

Ola Rapaziada!
Deve ser coisa de iniciante mas to com um probleminha.

Estava estudando e fiz 3 classes e uma classe pra executar, me entendem?

[color=“green”]// ProgramaTelecom.java
// Classe executavel do programa.

public class ProgramaTelecom {

public static void main ( String args[] )   {
	
	ProgramaTelecom summomProg = new ProgramaTelecom() ;		
	summomProg.executar ();
}

public void executar ()   {
	
	Telecom lista[] = new Telecom[2];
	
	lista[0] = new Celula();
	lista[0].setNumero ( 96855531 );
	lista[0].setOperadora ( "VIVO" );
	lista[0].setPreco ( 149.99 );
	lista[0].setMarca ( "Nokia" );
	lista[0].setTecnologia ( "TDMA" );
	lista[0].setNumPIN ( 82002 );
	
	lista[1] = new TelFixo();
	lista[1].setNumero ( 33871081 );
	lista[1].setOperadora ( "Brasil Telecom" );
	lista[1].setPreco ( 64.90 );
	lista[1].setCidade ( "Sobradinho" );
	lista[1].setIdChamada ( false );
	lista[1].setAdsl ( true );
	
	
	System.out.println ( lista[0].mostraDescricao() );
	System.out.println ( lista[1].mostraDescricao() );
}

}


// Telecom.java
// Classe para gerenciar informaçoes de telefones

public abstract class Telecom {

private long numero;
private String operadora;
private double preco;


public void setNumero ( long numero )   {
	
	this.numero = numero;
	
}

public void setOperadora ( String operadora )   {
	
	this.operadora = operadora;
	
}

public void setPreco ( double preco )   {
	
	this.preco = preco;
	
}


public long getNumero ()   {
	
	return this.numero;
	
}

public String getOperadora ()   {
	
	return this.operadora;
	
}

public double getPreco ()   {
	
	return this.preco;
}


public String mostraDescricao ()   {
	
	return "\nNumero : " + this.getNumero() +
	       "\nOperadora : " + this.getOperadora() +
	       "\nPreço : " + this.getPreco() + "\n";
	       
}

}


public class Celula extends Telecom {

private String marca;
private String tecnologia;
private long numPIN;


public void setMarca ( String marca )   {
	
	this.marca = marca;
	
}

public void setTecnologia ( String tecnologia )   {
	
	this.tecnologia = tecnologia;
	
}

public void setNumPIN ( long numPIN )   {
	
	this.numPIN = numPIN;
	
}


public String getMarca ()   {
	
	return this.marca;
	
}

public String getTecnologia ()   {
	
	return this.tecnologia;
	
}

public long getNumPIN ()    {
	
	return this.numPIN;
	
}


public String mostraDescricao ()   {
	
	return "   ***CELULAR***   \n" +
	       "Marca : " + this.getMarca() + 
	       "\nTecnologia : " + this.getTecnologia() +
	       "\nNumero do PIN : " + this.getNumPIN() +
	       super.mostraDescricao() +
	       "\n*******************";
}

}


public class TelFixo extends Telecom {

private String cidade;
private boolean idChamada;
private boolean adsl;


public void setCidade ( String cidade )   {
	
	this.cidade = cidade;
	
}

public void setIdChamada ( boolean idChamada )   {
	
	this.idChamada = idChamada;
	
}

public void setAdsl ( boolean adsl )   {
	
	this.adsl = adsl;
	
}

public String getCidade ()   {
	
	return this.cidade;
	
}

public boolean getIdChamada ()   {
	
	return this.idChamada;
	
}

public boolean getAdsl ()   {
	
	return this.adsl;
	
}

public String mostraDescricao ()   {
	
	return "   ***FIXO***   \n" + 
	       super.mostraDescricao() + 
	       "\nCidade : " + this.getCidade() +
	       "\nBina : " + ( this.getIdChamada() ? "Ativada" : "Desativada" ) +
	       "\nADSL : " + ( this.getAdsl() ? "Ativada" : "Desativada" );
}

}[/color]


A primeira é a classe pra executar. A segunda é a classe generica pras duas ultimas. Nessa brincadeira de fazer o metodo mostraDescricao() agir polimorficamente, quando executei o ProgramaTelecom me deparei com os seguintes erros :

[color=red]C:\Documents and Settings\Saulo Arthur\Meus documentos\Documentos\Java\ProgramaTelecom.java:20: cannot resolve symbol

symbol  : method setMarca  (java.lang.String)

location: class Telecom

lista[0].setMarca ( Nokia );

^

C:\Documents and Settings\Saulo Arthur\Meus documentos\Documentos\Java\ProgramaTelecom.java:21: cannot resolve symbol

symbol  : method setTecnologia  (java.lang.String)

location: class Telecom

lista[0].setTecnologia ( TDMA );

^

C:\Documents and Settings\Saulo Arthur\Meus documentos\Documentos\Java\ProgramaTelecom.java:22: cannot resolve symbol

symbol  : method setNumPIN  (int)

location: class Telecom

lista[0].setNumPIN ( 82002 );

^

C:\Documents and Settings\Saulo Arthur\Meus documentos\Documentos\Java\ProgramaTelecom.java:28: cannot resolve symbol

symbol  : method setCidade  (java.lang.String)

location: class Telecom

lista[1].setCidade ( Sobradinho );

^

C:\Documents and Settings\Saulo Arthur\Meus documentos\Documentos\Java\ProgramaTelecom.java:29: cannot resolve symbol

symbol  : method setIdChamada  (boolean)

location: class Telecom

lista[1].setIdChamada ( false );

^

C:\Documents and Settings\Saulo Arthur\Meus documentos\Documentos\Java\ProgramaTelecom.java:30: cannot resolve symbol

symbol  : method setAdsl  (boolean)

location: class Telecom

lista[1].setAdsl ( true );

^

6 errors

Process completed.[/color]

Alguem poderia me ajudar pois ja vasculhei todo o codigo e não deu pra detectar o problema… .
Desde ja .: valeu galera!

3 Respostas

BrunoBastosPJ

O problema ta que as duas referências lista[0] e lista[1] são do tipo Telecom… eles recebem um objeto Celula mas como a referência é Telecom você só pode chamar método da clase Mãe… é assim que o polimorfismo fucniona… para funcionar você pode transformar o objeto lista[0] em Celula

lista[0] = (Celula) lista[0];
S

Ola amigo, obrigado pela atenção.
Então eu só posso chamar os metodos que estão declarados na classe mãe, que no caso é Telecom? Então resolveria se eu criasse todos esses metodos na classe mae envez de te-los criado nas classes Celula e TelFix?
Se for desse jeito, então não haveria necessidade de se criar as “classes filhas” né? ou estou enganado. Me de mais detalhes por favor?
Obrigado

BrunoBastosPJ

A classe Telecon é um classe abstrata. Você pode ter diferentes implementações nas classes filhas… se você adicionar a declacação dos métodos que estão faltando na classe Telecon

exemplo:

public abstract setMarca( Sting marca );

você pode criar um método que receba a classe Telecon como parâmetro e dentro desse método chame um getMarca… Dependendo do tipo do objeto que você passar (Celula ou TelFix) a resposta vai ser diferente mas a chamda vai ser a mesma

Criado 2 de setembro de 2006
Ultima resposta 4 de set. de 2006
Respostas 3
Participantes 2