Buss anda meio calado ultimamente, estamos precisando de polêmicas =P 2008/9/22 Miguel Jonathan <[EMAIL PROTECTED]>
> O Peter explicou bem a idéia, vamos reforçar alguns pontos: > > Uma referência de um determinado tipo (ex: Pessoa) pode apontar para > qualquer objeto que seja da classe Pessoa ou de alguma subclasse dela (ex: > Aluno, Professor): > Pessoa p1 = new Pessoa(); > Pessoa p2 = new Aluno(); > Pessoa p3 = new Professor(); > > E, em tempo de execução, podemos fazer qualquer dessas variaveis passar a > apontar para outro objeto, desde que seja Pessoa ou subclasse dela: > Ex: p2 = p1; // etc. > > A única coisa que podemos garantir, a qualquer tempo, quando enviamos uma > mensagem a um objeto através de uma referência do tipo Pessoa, é que esse > objeto é capaz de responder ao protocolo de Pessoa. > Não podemos fazer algo como: > p2.getDre(); > Porque nada nos garante que p2 estará apontando sempre para um Aluno. > > Mas sempre poderemos fazer, com a certeza de que funcionará, algo assim: > p2.getNome(); > Porque getNome() é um método definido em Pessoa, portanto herdado ou > modificado nas subclasses. > > Alguém dirá: mas EU SEI que no meu programa, na hora que eu for fazer > p2.getDre(), p2 estará apontando para um Aluno, porque fui eu quem fiz isso > em uma linha anterior. Porque não compila? > > A resposta é que o compilador não faz uma análise do seu código para checar > isso, senão a compilação levaria séculos. Mas ele aceita que você diga: > "Pode compilar, que eu garanto que vai funcionar". Para dizer isso ao > compilador, você precisa fazer uma coerção do tipo da referência (ou > casting, em inglês): > ( (Aluno)p2).getDre(); > ou, se preferir mais clareza: > Aluno alu = (Aluno) p2; > alu.getDre(); > Aí o compilador não reclama mais. > > Com interfaces, ocorre uma situação similar. > Assuma que Pessoa implementa a interface Comparable<Pessoa>. Nesse caso, é > como se Pessoa (e, por extensão, também Aluno e Professor) também herdassem > o método dessa interface. Na realidade Pessoa apenas herda a obrigação de > implementar esse método, mas na prática isso significa que podemos garantir > que Profesor, Aluno, e Data sempre responderão à mensagem compareTo(Pessoa > p). > Podemos fazer então: > Comparable<Pessoa> comp1 = new Aluno(); > Comparable<Pessoa> comp2 = new Professor(); > > A única coisa que podemos garantir de uma variável tipo Comparable<Pessoa> > é que ela pode apontar para objetos que a implementam, mais nada. > > Portanto, escrever comp1.getDre() dará erro de compilação, porque nada > impede que você tenha feito antes: > comp1 = comp2; > e, nesse caso, comp1 agora estaria apontando para um Professor, que não > sabe o que é getDre() ! > > Mas sempre poderemos escrever: > Pessoa p = new Pessoa(.....); > comp1.compareTo(p); > > É isso aí... > > Jonathan > > > 2008/9/22 Zaedy Sayão <[EMAIL PROTECTED]> > > Eu cansei de falar isso na monitoria de hj.... >> Eh bom q vc nao tenha ido, senao eu vou te matar...xD >> >> Mas isso eh meio complicado por email. >> Se me achar amanha antes do teste te explico pessoalmente... >> >> []s >> >> 2008/9/22 Peter <[EMAIL PROTECTED]> >> >> Vou me aventurar... vamos ver se consigo ajudar: >>> >>> Imagine uma variável do tipo int. >>> Ele só pode apontar para valores tipo int. >>> Logo, só vai poder participar de operações que estejam definidas para o >>> tipo int. >>> Quando definimos uma classe ou uma interface, estamos definindo um tipo >>> também. >>> >>> Uma variável de um tipo de uma interface só pode participar de operações >>> válidas para aquela interface, ou seja, vc só vai conseguir chamar os >>> métodos declarados naquela interface (ou numa interface da qual ela tenha >>> herdado). >>> Isso pq esta variável estará apontando para uma classe qualquer da qual a >>> única coisa que vc pode garantir é que ela implementa aqueles métodos. Logo, >>> vc só poderá chamar aqueles métodos, independe da classe da instância >>> apontada por aquela referência. >>> >>> O mesmo serve para classes abstratas E concretas. Se uma referência de um >>> tipo de uma classe X aponta para uma instância de uma subclasse Y, vc só >>> poderá chamar métodos da classe X e das superclasses dela, não conseguirá >>> acessar os métodos exclusivos da subclasse Y. >>> >>> Isto garante tipagem da linguagem. Java é uma linguagem fortemente >>> tipada. >>> >>> Espero ter conseguido ajudar. Se vc tiver dúvidas, pode me ligar até >>> 21:00 ou aparecer no msn, icq, google talk, skype, sinal de fumaça, etc, >>> etc... >>> >>> Abraço! >>> >>> Peter P. Lupo >>> Undergraduating in Computer Science DCC/UFRJ >>> Sun Certified Java Associatehttp://pplupo.googlepages.com/ >>> Cell. +55 (21) 81742487 >>> >>> >>> >>> Flavio Costa wrote: >>> >>> Meio dificil explicar isso via e-mail. >>> Acho que essa dúvida deveria ser sanada pessoalmente com os monitores ou >>> o professor. >>> >>> 2008/9/22 FernandoKling <[EMAIL PROTECTED]> >>> >>>> >>>> se eu entendi bem, a dúvida do gustavo é em relaçao à variaveis cujo >>>> tipo sao interfaces ou classes abstratas >>>> tipo o trecho de código q tinha no teste 1: >>>> M x = new A(); >>>> onde M podia ser uma interface... >>>> >>>> On 22 set, 19:27, Gustavo Cury <[EMAIL PROTECTED]> wrote: >>>> > Sobre esta dúvida: "Uso correto de variáveis do tipo de uma interface >>>> ou do tipo de uma classe abstrata" >>>> > Está na pagina do professor, fui olhando os tópicos e quando chegou >>>> nesse, não entendi. >>>> > Gustavo Cury >>>> > >>>> >>>> >>>> >>> >>> >>> -- >>> Flávio Coutinho da Costa >>> >>> >>> >>> >>> >> >> >> -- >> Zaedy Dantas Sayão >> Graduando em Ciência da Computação DCC/UFRJ >> http://www.manufato.com.br/ >> MSN: [EMAIL PROTECTED] >> >> >> > > > > -- Flávio Coutinho da Costa --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Comp 2 - Geral" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/comp2-geral?hl=en -~----------~----~----~----~------~----~------~--~---
