Quando utilizar interfaces coerentemente?

Pessoal, veja bem, eu ja sei que:

  • Interfaces servem para utilizar-se do conceito de multipla herança em Java, ok.
  • Interfaces, possuem características de ação, normalmente terminadas em: ‘avel’, ‘ivel’…

Ai penso, e lembro da sobescrita e sobrecarga… e penso: Realmente há necessidade de utilizar interfaces? Claro que deve haver, mas eu não consegui compreender sozinho ainda, alguém poderia me dar uma luz?

Obrigadão!
:slight_smile:

estaria correto isso:

[code]niveis {
é_Administrador
podeRemoverUsuarios
podeAdicionarUsuarios
podeVenderComDesconto

}
class usuario extends pessoa implements niveis {
login
senha
}

class pessoa {
nome
rg
idade
}[/code]

Vou te dar um exemplo tosco de uso de interface. Mas dá pra entender a idéia.

Vc tem um JTextField e um JCheckBox. Os dois tem funções e utilizações distintas, mas vc quer que ambos tenham um método chamado “getCampo” (o motivo não importa).

Vc pode criar um interface com este método e criar novos objetos JTextField e JCheckBox implementando esta interface. Digamos que o nome desta interface seja InterfaceCampo. Veja o código:

InterfaceCampo a = jtfNome; InterfaceCampo b = jcbAtivo; System.out.println(a.getCampo()); System.out.println(b.getCampo());

Logo, através de uma interface podemos criar um comportamento padrão para objetos de tipos diferentes. Daí o nome “múltipla herança”.

Fui claro ou te confundi ainda mais?

[quote=marciosantri]Vou te dar um exemplo tosco de uso de interface. Mas dá pra entender a idéia.

Vc tem um JTextField e um JCheckBox. Os dois tem funções e utilizações distintas, mas vc quer que ambos tenham um método chamado “getCampo” (o motivo não importa).

Vc pode criar um interface com este método e criar novos objetos JTextField e JCheckBox implementando esta interface. Digamos que o nome desta interface seja InterfaceCampo. Veja o código:

InterfaceCampo a = jtfNome; InterfaceCampo b = jcbAtivo; System.out.println(a.getCampo()); System.out.println(b.getCampo());

Logo, através de uma interface podemos criar um comportamento padrão para objetos de tipos diferentes. Daí o nome “múltipla herança”.

Fui claro ou te confundi ainda mais?[/quote]

pelo que eu entendi no seu exemplo, serve apenas para obrigar uma classe a conter aqueles métodos ? pq senão, neste caso, poderiam apenas ter métodos distintos de getCampo… privates msm, certo ?

O termo correto não é obrigar, e sim que o Objeto dakela classe vai adquirir aquele comportamento, de acordo com suas características.

[quote=MrDataFlex][quote=marciosantri]Vou te dar um exemplo tosco de uso de interface. Mas dá pra entender a idéia.

Vc tem um JTextField e um JCheckBox. Os dois tem funções e utilizações distintas, mas vc quer que ambos tenham um método chamado “getCampo” (o motivo não importa).

Vc pode criar um interface com este método e criar novos objetos JTextField e JCheckBox implementando esta interface. Digamos que o nome desta interface seja InterfaceCampo. Veja o código:

InterfaceCampo a = jtfNome; InterfaceCampo b = jcbAtivo; System.out.println(a.getCampo()); System.out.println(b.getCampo());

Logo, através de uma interface podemos criar um comportamento padrão para objetos de tipos diferentes. Daí o nome “múltipla herança”.

Fui claro ou te confundi ainda mais?[/quote]

pelo que eu entendi no seu exemplo, serve apenas para obrigar uma classe a conter aqueles métodos ? pq senão, neste caso, poderiam apenas ter métodos distintos de getCampo… privates msm, certo ?

[/quote]

Mas se vc criar métodos distintos não poderá ter uma variável de referência de um tipo só acessando vários tipos de objetos. No meu exemplo vc sabe quais são os objetos. Agora veja este:

[code]{

InterfaceCampo a = jtfNome;
InterfaceCampo b = jcbAtivo;
imprimirCampo(a);
imprimirCampo(b);

}

public void imprimirCampo(InterfaceCampo x){
System.out.println(x.getCampo());
}[/code]

Temos um método para imprimir o nome do campo. Se vc simplesmente criasse métodos privados nas classe não teria como fazer isto de maneira simples. Mesmo se o seu método fosse público, vc teria que fazer vários ifs para testar o tipo de objeto e se houvesse um novo tipo de objeto que implementasse o método getCampo teria que sair varrendo o sistema para corrigir seus ifs. A interface simplifica este processo além de garantir que as classes que a implementam terão os métodos de sua definição. É meio que “herança”, só que não é direta. É uma saída para um objeto “herdar” de mais de uma classe.

qdo estudar threads vai ver que é mais pratico… implements Runnable que extends a class Thread… alem de ser mais eficiente.

Neste tópico a uma extensa explicação, com exemplos, do assunto:
http://www.guj.com.br/posts/list/51866.java#273117

E nesse tem outra explicação com exemplos de um uso de interface:
http://www.guj.com.br/posts/list/55387.java#290673