Dúvida com classe de Interface

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!!

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.

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
	}

}

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