Dúvida com classe de Interface

3 respostas
Guevara

Olá pessoal!
Estava lendo o tutorial do GUJ (http://www.guj.com.br/article.show.logic?id=123) para classe de interface, mas não esclareceu a minha dúvida quanto ao conteúdo da classe, já que não é mostrado no tutorial.

Tenho esta classe de Interface Usuario:

public interface Usuario  {
	public String getNome();
	public String getLogin();
	public String getSenha();
	public String getRole();
}

E criei uma Classe Cliente e outra Funcionário, que usarei para persistir, a classe Usuario será de controle de login, como é uma Interface não será instanciada, quando fiz o implements para a classe Usuario o Eclipse sugeriu implementar o código, ao aceitar ele gerou o seguinte:

@Entity
public class Funcionario implements Usuario, Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;	
	
	public void setNome(String nome) {
	}

	public void setEmail(String email) {
	}

	public void setLogin(String login) {
	}

	public void setSenha(String senha) {
	}
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getEmail() {
		return getEmail();
	}

	public String getLogin() {
		return getLogin();
	}

	public String getRole() {		
		return getRole();
	}

	public String getSenha() {
	    return getSenha();
	}

	public String getNome() {
		return getNome();
	}

}

Está certo isso?? Está td público, nenhum atributo e muito menos private. =/
O que eu preciso é controlar os usuarios que logam no sistema, uso o VRaptor aqui e tenho apenas uma classe Usuario que é persistida. Agora quero persistir quem é cliente e quem é funcionario separadamente e continuar controlando o login deles. Alguém poderia esclarecer essa dúvida?

Abraço!!

3 Respostas

Guevara

Bom, ao chamar a aplicação pelo browser o banco foi criado, mas a classe Funcionario e Cliente foram criadas apenas com a coluna ID, o resto foi ignorado, conclusão:
Ou o conteúdo das classes estão errados ou a classe de interface precisa ser anotada com alguma coisa.

emmanuelrock

Olá amigo.

Não é legal chamar uma interface de “classe de interface”. Uma interface é uma interface e uma classe é uma classe.

Em segundo vc deve criar os atributos e mapeá-los com a anotação @Column, e implementar os métodos abstratos oriundos da interface Usuario, assim:

@Entity
public class Funcionario implements Usuario, Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;	
       
        @Column(name="nome")
        private String nome;
        
        //outros campos... 
	
        public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setNome(String nome) {
                this.nome = nome;//implementação correta
	}

	public String getNome() {
		return nome;//implementação correta,faça para todos os atributos
	}

}
discorpio

Boa noite Guevara.

O que voce precisa entender é que há regras para definir Interfaces. Primeiro que Interfaces não são classes, portanto há um certo comportamento restrito quanto a classes.

1º) Todo atributo definido em Interface são definidos por padrão como “public”, “static” e “final”, isto porque Interfaces foram construídas com o escopo de se definir regras de métodos e atributos padrões para classes, como se fosse uma espécie de contrato a ser cumprido, se o atributo tem que ser padrão, então ele tem que ser constante (final), estático (static) pois não pode ser instânciado e público (public) para que os métodos e os atributos possam ser enxergados.

2º) Quanto aos métodos de Interface, uma Interface é 100 % abstrata, portando os métodos são por padrão definidos como abstratos e públicos.

A meu ver o que serviria para voce seria uma classe abstrata, isto porque voce quer fazer persistencia nas classes Funcionario e Usuario, pois a classe abstrata, que já é uma classe, difere de Interface, onde voce pode definir atributos que não sejam final e static e voce pode implementar métodos que não sejam abstrato. Na realidade voce pode até criar uma classe abstrata que não possua métodos abstratos, voce sabia disto :?:

Hein :?: :?: :?: :!: :!: :!:

Sim, voce pode criar uma classe abstrata sem possuir métodos abstratos, apenas define a classe como abstrata para impedir que ela seja instanciada, vamos a exemplo que vai clarear a sua mente.

public abstract class Login {
   // Atributos
    public String nome = null;
    public String login = null;
    public String senha = null;
    public String role = null; 
    
    // Métodos
    public String getNome() {
        return nome;
    }

    public String getLogin() {
        return login;
    }

    public String getSenha() {
        return senha;
    }

    public String getRole() {
        return role;
    }

    public void setNome(String nome) {
       this.nome = nome;
    }

    public void setLogin(String login) {
       this.login = login;
    }

    public void setSenha(String senha) {
       this.senha = senha;
    }

    public void setRole(String role) {
       this.role = role;
    }

}

// A classe Funcionario
@Entity   
public class Funcionario extends Login implements Serializable {   
  
    private static final long serialVersionUID = 1L;   
       
    @Id   
    @GeneratedValue(strategy = GenerationType.IDENTITY)   
    private Long id;       

    public Funcionario(String pnome, String plogin, String psenha, String prole){
          setNome(pnome);
          setLogin(plogin);
          setSenha(psenha);
          setRole(prole);
    }
}

Repare que os métodos que não foram definidos como abstratos, não precisaram ser declarados na classe herdada (Funcionario), isto porque eles já foram implementados na classe abstrata “Login”, e voce pode enxergá-los, virtualizando assim como se fossem métodos padrões comum a todas as classes que heradarem de “Login”.

Se voce perceber, houve uma grande diferença entre a Interface que voce Imprementou e a Classe Abstrat que eu criei, na classe abstrata, os métodos foram já implementados, assim ele ficará do mesmo jeito para todas classes que o herdar (Funcionario e Usuario). Quanto a Interface, por eles serem abstratos, podem ser modificados a cada classe que o implementar, pois a Interface cabia, se as definições dos métodos não fossem padrão para todos as classes.

Espero ter ajudado

Criado 18 de abril de 2010
Ultima resposta 18 de abr. de 2010
Respostas 3
Participantes 3