boavida Posted April 3, 2012 at 11:18 AM Report #447210 Posted April 3, 2012 at 11:18 AM Boas, tenho uma classe pai e uma filho depois tenho um array com o tipo pai. e sei que tenho dentro do array os dados do filho só que estou numa classe principal , e no metodo main, não estou a conseguir fazer o output dos dados do filho através do array Agradeço desde já a quem tiver oportunidade para dar uma dica!
brunoais Posted April 3, 2012 at 11:43 AM Report #447216 Posted April 3, 2012 at 11:43 AM Sem código é demasiado confuso "[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31 Life is a genetically transmitted disease, induced by sex, with death rate of 100%.
HappyHippyHippo Posted April 3, 2012 at 12:09 PM Report #447223 Posted April 3, 2012 at 12:09 PM for (i = 0; ...; ...) { if (lista[i].getClass().getSimpleName().equals("Pai")) { Pai aux = (Pai)lista[i]; ... } else { Filho aux = (Filho)lista[i]; ... } } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Knitter Posted April 3, 2012 at 12:23 PM Report #447226 Posted April 3, 2012 at 12:23 PM Esse exemplo derrota um pouco a ideia de polimorfismo. Se a classe pai tiver o método de apresentação de dados, então a classe filho só terá de o re-implementar.
brunoais Posted April 3, 2012 at 12:26 PM Report #447227 Posted April 3, 2012 at 12:26 PM ... É melhor assim: for (i = 0; ...; ...) { if (lista[i].getClass() == Pai.class) { Pai aux = (Pai)lista[i]; ... } else { Filho aux = (Filho)lista[i]; ... } } "[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31 Life is a genetically transmitted disease, induced by sex, with death rate of 100%.
HappyHippyHippo Posted April 3, 2012 at 02:07 PM Report #447242 Posted April 3, 2012 at 02:07 PM É melhor assim: como já referi aqui no forum, sei java mas não é o meu forte ... até porque não programo nada em java já vai prai 5 anos ... mas obrigada, também gosto de aprender IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Knitter Posted April 3, 2012 at 02:28 PM Report #447247 Posted April 3, 2012 at 02:28 PM Qualquer um dos dois exemplos é um mau exemplo se o objectivo é usar polimorfismo. Se o objectivo não é usar polimorfismo continuaria a ser um mau exemplo mas, eventualmente, passível de ser usado. Recorrendo a polimorfismo a única forma de obter o que foi pedido é se a classe filho implementar o mesmo método que é chamado na classe pai. Ex: public class Pai { private String nome; public Pai(String nome) { this.nome = nome; } public String getNome() { return nome; } public void apresentar() { System.out.println("Olá, o meu nome é " + nome); } } class Filho extends Pai { private Pai pai; public Filho(String nome, Pai pai) { super(nome); this.pai = pai; } @Override public void apresentar() { super.apresentar(); System.out.println("E sou filho de " + pai.getNome()); } } O método será escolhido de acordo com o tipo de dados real contido no vector: public static void main(String[] args) { Pai[] pessoas = new Pai[5]; pessoas[0] = new Pai("João"); pessoas[1] = new Pai("António"); pessoas[2] = new Filho("João Jr.", pessoas[0]); pessoas[3] = new Filho("Ricardo", pessoas[0]); pessoas[4] = new Filho("Miguel", pessoas[1]); for (int i = 0; i < pessoas.length; i++) { pessoas[i].apresentar(); } }
HappyHippyHippo Posted April 3, 2012 at 03:44 PM Report #447275 Posted April 3, 2012 at 03:44 PM isso claro é no mundo ideal .... imagina isto : class Objecto { protected float area; public float function getArea() { return this->area; } } class Objecto3D extends Objecto { protected float volume; public float function getVolume() { return this->volume; } } int main(String[] args) { Objecto lista[]; // calcular o volume dos objectos guardados na lista ... } e não venhas dizer que para isso tens de ter duas listas diferentes .... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Knitter Posted April 3, 2012 at 04:21 PM Report #447293 Posted April 3, 2012 at 04:21 PM Por isso é que reforcei o facto de estar a usar polimorfismo, em que o comportamento de um objecto é alterado ao longo da hierarquia. No caso que indicaste foge ao polimorfismo já que não queres alterar/refinar/etc o comportamento herdado mas sim acrescentar comportamentos novos. E sim, a solução mais simples seria a utilização de estruturas diferentes já que não faz sentido ter os objectos misturados, não ganhas nada com isso, mas mesmo que estivesses na mesma lista, usar o nome da classe não seria a primeira opção, há opções mais simples.
pedrotuga Posted April 3, 2012 at 05:16 PM Report #447317 Posted April 3, 2012 at 05:16 PM Acho que o que o boavida quer é um caso típico de polimorfismo class A{ int attA; void metodo(){ System.out.println(attA); } } class B extends A{ /*podes fazer override do método (a anotação '@override' é opcional)*/ @override void metodo(){ System.out.println("cebolas"); } } A a = new A(); A b = (A) new B(); A[] aArray; anArray = new A[2]; a.attA = "gelados"; //podes meter ambos os objectos dentro do mesmo array mas têm que ser do mesmo tipo, independentemente do construtor que usares aArray[0] = a; aArray[1] = b; aArray[0].metodo(); //gelados aArray[1].metodo(); //cebolas Ter em atenção que casts impossibilitam o compilador de detectar erros de incompatibilidade de tipos. Caso não seja possível converter um tipo de dados noutro, o erro acaba por ocorrer em runtime. Uma solução mais robusta é usar interfaces ou genéricos, mas isso já é off-topic
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now