Usar interface somente para Polimorfismo

Pessoal, tudo belezinha ?

A dúvida é a seguinte: Eu poderia utilizar Interface para somente ter polimorfismo ?

Sei que interface possui 100% métodos abstratos, mas eu poderia criar uma interface sem os métodos abstratos ?

Exempo :


 public interface Funcionario {

}
// em uma classe
Funcionario f1 = new Gerente () ;
Funcionario f2 = new Diretor () ;

Em algum método utilizar:

public void Administrar (Funcionario func) { // faz alguma coisa }

ja ouvi falar bastante disso, tenho exatamente esse esquema de funcionario num projeto de Banco que eu tenho aqui, ate agora nao percebi problemas;

Este é um dos principais objetivos da interface, você não se preocupar com o tipo concreto, e utilizar apenas uma abstração dele.

Isto é utilizado em larga escala, e é considerado Program to an interface, not an implementation, onde pode ser lido mais http://www.artima.com/lejava/articles/designprinciples.html

Na propria API do java é utilizado muito isto, repare que temos uma interface List, como boa pratica você deve sempre utilizar ela como referencia, pois em alguma versão para frente do java, ou até mesmo você precisar criar uma nova lista, voce implementa o List, e todo o seu código não vai ser preciso mudar, apenas onde é feito a instancia da lista.

Att

E quando precisar fazer isto:

class Funcionario{
      protected String nome;
}

class Gerente extends Funcionario{}

class Diretor   extends Funcionario{}

???

emmanuelrock

class Funcionario{   
      protected String nome;   
}   
  
class Gerente extends Funcionario{}   
  
class Diretor   extends Funcionario{}  
class Funcionario{
      protected String nome;
}

class Gerente extends Funcionario{}

class Diretor   extends Funcionario{}
 

Seria herança, e não interface.

O que tenho em mente é que não quero herdar, e nem implementar. Somente utilizar o poder de polimorfismo.

Pode usar isso sim, sem problemas. Uma interface sem métodos a gente costuma chamar de “interface de marcação”, ou algo assim.

Mas como usar polimorfismo sem herança ou implementação?

Ola… achei interessante essa abordagem… mas nao entendi uma coisa.

Ao utilizar os objetos f1 e f2 que sao do tipo Funcionario, eles entao nao terao nenhum atributo e nenhum metodo a nao ser aqueles que ja herdam por default da classe Object.

Mas eae… Para que serveria f1 e f2 entao?

Espero ter sido claro na minha duvida…

vallews…

Realmente, interfaces de marcação são estranhas; só faz sentido usá-las em casos específicos. Como, por exemplo, quando você quer fazer alguma magia negra para pegar só as classes que representam seus modelos via reflection ou alguma coisa do tipo…

Bem… esse seu exemplo não entra muito no meu conceito de polimorfismo… :shock:

Um exemplo de interface de marcação na API é a Interface Serializable

http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html

Att

É… não é bem o que a gente está acostumado a entender como polimorfismo, mesmo. Mas não deixa de ser: estamos vendo uma classe de jeitos diferentes. :wink:

denislima

F1 e F2 são apenas variáveis de referências, com objetos diferentes (diretor e gerente), mas quando for utilizar o método Administrar, esse método vai receber um variável do tipo Funcionario.

Talvez eu não tenha conseguido exprimir a minha dúvida, mas colocando em palavras simples, posso utilizar interface sem métodos e sem constates (public static final)?

[quote=leandros.silva]denislima

F1 e F2 são apenas variáveis de referências, com objetos diferentes (diretor e gerente), mas quando for utilizar o método Administrar, esse método vai receber um variável do tipo Funcionario.

Talvez eu não tenha conseguido exprimir a minha dúvida, mas colocando em palavras simples, posso utilizar interface sem métodos e sem constates (public static final)?[/quote]

Ainda nao entendi o exemplo do metodo administrar…

Vai receber e faria o que com os objetos f1 e f2?? Sendo que o atributo f1 e f2 sao do tipo Funcionario que nao tem nada nele…

Dentro do metodo administrar eu colocaria f1. e dai nao teria nada para chamar, nem um metodo para chamar :frowning:

Nao consegui entender ainda para que serviria…

fallows…

[quote=leandros.silva]
Talvez eu não tenha conseguido exprimir a minha dúvida, mas colocando em palavras simples, posso utilizar interface sem métodos e sem constates (public static final)?[/quote]

Sim

Você pode fazer isso, só tenha certeza de que essa interface representa um conceito forte, como você fez ali com o tipo funcionário. A tendência é que a medida que esse sistema cresça, a interface acabe ganhando métodos.

denislima
f1 e f2 é referênciaa um objeto.

f1.Administrar();
f2.Administrar();

Vai invocar o método e realizar uma tarefa. O que eu preciso é do polimorfismo, pois não vou criar dois métodos (um que recebe diretor e outro gerente). Crio somente um método que recebe funcionário, sendo que direitor e gerente é um funcionario atráves da interface.

O método Administrar é apenas um método que realizar uma ação seja ela qual for, é só para exemplificar.