Ola pessoal,
Estou com uma duvida, sei que eh algo bem basico mais ainda me confunfo com isso, tenho um bom conhecimento das diferencas entre o que eh classe, interface, classe abstrata, composicao e etc… mas por exemplo se eu tenho o seguinte :
Uma classe abstract Animal que eh superclasse de Leao, Tigre e Peixe (ou seja essas 3 extends Animal) ok , ate ai tudo bem , depois um interface Ferocidade por exemplo que possui o metodo Rugir , e apenas Leao e Tigre implementam essa interface e usam esse metodo, ou seja Peixe nao, ok ai tudo bem tambem, mas por exemplo agora ta minha duvida
Sei que posso instanciar essas minhas subclasses de 3 formas diferentes :
Animal a = new Leao(); // referencia a Animal
Leao a = new Leao(); // referencia a Leao
Ferocidade a = new Leao(); // referencia a Interface
mas dependendo de como eu instanciar Leao ou seja atraves de um dos 3 acima ganho certas funcionalidade e perco outras, ou seja, posso usar alguns metodos e atributos e tambem deixo de poder usar outros metodos e atributos, entao como faco para usar bem a heranca e interface juntas , como nesse caso mas mesmo assim poder aproveitar de todas a funcionalidades que eles(as) me oferecem.
Obrigado.
Já tive essa duvida também, o que acontece é que a vm cria os 3 objetos de forma idêntica, com todas as funcionalidades, porém de acordo com tipo da instância as funcionalidades ficam omitidas.
Ex:
Animal a = new Leao(); // referencia a Animal
Caso tentar acessar um método da interface ou da classe filha, irá dar erro de compilação, pois nesta instância só estão disponíveis as funcionalidades de “Animal”.
Porém como disse, as funcionalidades ficam só omitidas, tento a possibilidade de fazer cast e ter as funcionalidades desejadas:
EX:
((Leao) a).metodoDaClasseLeao();
ou…
Leao l = (Leao) a;
l.metodoDaClasseLeao();
A mesma coisa se aplica a interface, pois o objeto que foi criado é um Leão…
Espero ter ajudado
desculpe responder com links, mas acredito que eles dizem tudo o que teria para falar sobre isso…
[list]Post do GUJ;[/list]
[list]Como não aprender OO - Herança;[/list]
[list]No, inheritance is not the way to achieve code reuse!;[/list]
[list]A Conversation with Java’s Creator, James Gosling;[/list]
Espero que ajude…
[]'s
Ola pessoal,
Obrigado pelos posts ajudaram bastante sim, estive fazendo uns teste aqui mais ainda tenho uma duvida.
Por exemplo seguindo o exemplo que citei acima percebi que se eu fizer por exemplo :
Leao a = new Leao(); // no caso essa eh a subclasse
poderei usar diretamente todos os metodos tanto da superclasse quanto da interface mais se eu fizer :
Interface a = new Leao();
ou
Animal a = new Leao();
So terei acesso ou aos metodos da interface ou do Animal.
Sei que heranca ajuda no quesito polimorfismo e que deve-se preferir o uso de interfaces em vez de heranca mas qual a vantagem entao de eu fazer um dos dois acima e restringir meus acessos aos metodos, se eu posso fazer logo de cara : Leao a = new Leao() e ter acesso a tudo? ou seja pra que serviria entao fazer um dos dois que acabo de citar.
Obrigado.
Imagine agora que você queira fazer uma classe Zoológico…
Imagine que você queira armazenar os animais em um arraylist…
Se você criar a classe Leão… sem herança/interface… você teria que ter um arraylist para cada tipo de animal…
Do jeito que está agora, você pode ter um arraylist do tipo Animal e colocar todos os animais dentro desse arraylist…
Agora imagine que você quer listar todos os animais e imprimir o seu tipo, rugido (interface ferocidade), etc…
Criando uma interface/herança você obriga a classe a ter o atributo/método que você deseja ter…
Espero ter ajudado em algo…
Abraços
Ola damianijr,
Obrigado pelas explicacoes, agora clareou mais, ou seja como todos herdam de animal fica muito mais facil
trabalhar com Collections no caso, e criar uma lista que armazene tudo que seja do mesmo tipo.
Se fosse tudo separado teria que ter um array para cada tipo de animal. entendi.
vlw.
[quote=danieldomingues86]Ola pessoal,
Obrigado pelos posts ajudaram bastante sim, estive fazendo uns teste aqui mais ainda tenho uma duvida.
Por exemplo seguindo o exemplo que citei acima percebi que se eu fizer por exemplo :
Leao a = new Leao(); // no caso essa eh a subclasse
poderei usar diretamente todos os metodos tanto da superclasse quanto da interface mais se eu fizer :
Interface a = new Leao();
ou
Animal a = new Leao();
So terei acesso ou aos metodos da interface ou do Animal.
Sei que heranca ajuda no quesito polimorfismo e que deve-se preferir o uso de interfaces em vez de heranca mas qual a vantagem entao de eu fazer um dos dois acima e restringir meus acessos aos metodos, se eu posso fazer logo de cara : Leao a = new Leao() e ter acesso a tudo?[/quote]
Porque normalmente você não quer ter acesso a tudo. “Acesso a Tudo” é exatamente a violação do encapsulamento e do polimorfismo que vc está tentando usar com herança e interfaces.
Vc não entende os exemplos porque não é assim que se vê a utilidade do polimorfismo.
Vc tem que entender que alguns métodos precisam apenas de um subtipo enquanto outros do supertipo
por exemplo
public int idade(Animal animal){
return calculaIdade(animal.getDataNascimento());
}
public void fazbarulho(Ferocidade feroz){
feroz.ruge();
}
A diferença está na responsabilidade. Alguns métodos operam sobre um tipo e outro sobre outro.
Repare que nenhum deles opera directamente sobre a classe especifica do animal.
É na invocação de métodos que vc vê a utilidade do polimorfismo. Métodos sempre recebem abstrações e retornam abstrações. Quando mais o seu sistema seguir esta regra mais polimorfico ele é , e portanto, mais poderoso ele é.
Olá sergiotaborda,
Obrigado pelo explicação, era justamente esse conceito que eu estava tentando entender.
Agora ficou bem mais claro como devo usar herança e interfaces.
Muito Obrigado.
Olá sergiotaborda,
Obrigado pela explicação, era justamente esse conceito que eu estava tentando entender.
Agora ficou bem mais claro como devo usar herança e interfaces.
Muito Obrigado.