Interface - não consigo

6 respostas
rodrigo_salla

Boa noite…

Por gentileza, se alguém puder me explicar, não estou entendendo, sei toda a teoria, quase toda, senão conseguiria né rs, mas na prática faz uma semana que estou tentando, nem sei mais o que escrevo, ja tentei de tudo…

Muito obrigado!!!

Por exemplo, tenho a class Diretor

public class Diretor extends Funcionario implements Autenticavel
{
	private String login;

	public Diretor(String nome, String departamento, double salario, Data dataAdmissao, String rg, boolean estaNaEmpresa, String login)
	{
		super(nome, departamento, salario, dataAdmissao, rg, estaNaEmpresa);
		this.login = login;
	}
	
	public String getLogin()
	{
		return this.login;
	}
	
	public void setLogin(String login)
	{
		this.login = login;
	}
	
	@Override
	public double getBonificacaoNoSalario() 
	{
		return this.getSalario() * 2 + 2000;
	}

	public boolean autenticaLogin(String login) 
	{
		return Validacao.ValidaLogin(login);
	}
	
}

que implements Autenticavel

public interface Autenticavel 
{	
	public boolean autenticaLogin(String login);
	public String getLogin();
	public void setLogin(String login);
	
}

E nem todos Funcionarios tem login, Secretaria, Engenheiro que extends Funcionario não tem, somente a Diretor e Gerente. Por isso da Interface, quero logar num sistema, receber como argumento todos autenticaveis, fiz minha class SistemaInterno com um método para isso e é ai que está a confusão vejam…

public class SistemaInterno 
{	
	public void login(Autenticavel a)
	{
		//confusao1 - o login é o último argumento do construtor "gerencia".
		Diretor func = new Diretor("Rodrigo", "Diretoria", 10500.0, new Data(07,04,1976), "RG 710", true, "gerencia");
		String senha = func.getLogin();
		a.autenticaLogin(senha);
		
	}
	public static void main(String[] args)
	{
		//confusao2
		Autenticavel func = new Diretor("Rodrigo", "Diretoria", 10500.0, new Data(07,04,1976), "RG 710", true, "123");
		SistemaInterno si = new SistemaInterno();
		si.login(func);

	}
}
	/* confusao1 - para mim é absurdo criar	um objeto dentro desse metodo, mas 
	  não consegui fazer de outra forma porque quero que seja validado o login do objeto
	  referenciado por "func", ai no main... Não gosto de fazer na mesma classe mas de tanto 
	  tentar acabei sucunbindo.
	  confusao2 - onde é o lugar certo tenho que instanciar novamente para poder
	  chamar si.login(func); por favor, me ajudem, descupem-me pela minha "burrice", mas não sei mais
	  o que fazer, tentei um monte de coisas.
	  O OBJETIVO - e fazer o public void login(Autenticavel a) autenticar o login da propria
	  referencia "func".*/

6 Respostas

A

Velho , em relação a interface tá tudo correto. Vc não precisa criar um Objeto Diretor lá no seu metodo login(Autenticavel a), vc não precisa saber que vc está autenticando, apenas que ele é Autenticavel. Essa é a idéia da Interface, desacoplar seu codigo. Espero que tenha ajudado.

Alberto

rodrigo_salla

Muito obrigado por responder Alberto…

Só não entendo como vou conferir o login dessa referencia func == “gerencia”? como vou conseguir pegar isso?

Rodrigo

Sombriks

rodrigo_salla, bom dia.

A sua interface diz somente diz se o objeto é autenticável ou não. Na verdade eu recomendo um reestudo da sua arquitetura, porque se o negócio começa a ficar compexo demais quer dizer que vc não pensou em todos os detalhes.

Parta de um modelo de processos que aconteçam no dia-a-dia e em seguida repense isso como um sistema informatizado…

Porque se vc tem um sistema e precisa autenticar alguma coisa vc pode usar uma interface “autenticar”. mas se vc precisar de mais funcionalidades semelhantes em vários objetos distintos (saber se é diretor ou não, por exemplo) e quer resolver isso por meio do uso de interfaces repense a(s) interface(s) que for utilizar.

Qualquer dúvida tamos aí.

rodrigo_salla

Me desculpem, mas continuo não entendendo…

Como saio desse meu problema? como faço o reestudo? o que fiz de errado?

Rodrigo

R

olha, a sua classe sistema interno esta meio estranha, vc nao precisa criar um novo objeto si pois vc ja esta executando num objeto deste tipo, em vez de usar estas linhas desta forma

SistemaInterno si = new SistemaInterno();
si.login(func);

nao seria melhor fazer assim:

this.login(func);

e em login em vez de criar um novo objeto diretor vc pode usar o func passado como parametro para usar a funcao getLogin.

Espero ter ajudado

Mantu

rodrigo_salla:
Muito obrigado por responder Alberto…

Só não entendo como vou conferir o login dessa referencia func == “gerencia”? como vou conseguir pegar isso?

Rodrigo


Mais ou menos isso. Você pode verificar se um funcionário é autenticável perguntando se ele é uma instância de Autenticavel

if(func instanceof Autenticavel){
   Autenticavel aut = (Autenticavel)func;
   /* aut agora é uma variável que referencia o mesmo objeto referenciado 
    * por func. A diferença é que a partir de aut - que é do tipo
    * Autenticavel - você  pederá acessar os métodos previstos na
    * interface Autenticavel.
    */
}else{
   //Faça aqui o que quiser fazer com func, sabendo que ele não é autenticável
}
Criado 28 de janeiro de 2007
Ultima resposta 29 de jan. de 2007
Respostas 6
Participantes 5