Dúvida no uso de Herança e Interface

Olá pessoal!

Estive o dia todo lendo sobre herança e interfaces, inclusive das apostilas da Caelum. Decidi seguir o caminho do uso de Interfaces ao invés de Herança.
O meu projeto é de uma Imobiliária, poderia fazer com Herança ou com Interfaces, conforme a figura:

O que eu quero é deixar a aplicação o mais desacoplada possível, já que a a mesma poderá crescer, existe sempre a mudança de requisitos e quando mais solto estiver o código, melhor.

A minha dúvida é se ao usar Interfaces como mostrado na figura eu estaria aplicando Interfaces onde não seria necessário (over-engineering) ou se a minha decisão é a mais correta, especificamente para o caso mostrado na figura.

Abraço!!!

se for usar ferramenta de persistencia, como hiberante por exemplo … vai acabar se vendo sem muita possibilidade, e mesmo que use a Interface, vai ter que usar herança para usar em outras entidades…

=/

Essa tua Interface faz o que? Que métodos ela vai conter. Você poderia criar uma classe abstrata, e depois você iria herdar todos os atributos ou métodos da classe abstrata.

Olá pessoal!

A minha idéia é criar uma interface e duas classes conforme o exemplo para funcionário:

public interface Funcionario {  
public Long getIdFuncionario();
public String getNome();
public String getLogin();
public String getSenha();
public String getStatus();
}  
public class Gerente implements Funcionario {  

private Long idFuncionario;
private String nome;
private String login;
private String senha;
private String status;

public String getIdFuncionario() {  
         return idFuncionario;  
      }  
public String getNome() {  
         return nome;  
      }  
public String getLogin() {  
         return login;  
      }  
public String getSenha() {  
         return senha;  
      }  
public String getStatus() {  
         return status;  
      }  
}  

A classe Vendedor:

public class Vendedor implements Funcionario {  

private Long idVendedor;
private String nome;
private String login;
private String senha;
private String status;

public String getIdVendedor() {  
         return idVendedor;  
      }  
public String getNome() {  
         return nome;  
      }  
public String getLogin() {  
         return login;  
      }  
public String getSenha() {  
         return senha;  
      }  
public String getStatus() {  
         return status;  
      }  
}  

Como o objetivo é separar o que cada um poderá fazer no sistema enquanto estiver logado, achei que usando Interfaces poderia controlar melhor isso, quero evitar a amarração da Herança.

Lavieri, eu uso VRaptor3 + Hibernate, não poderei implementar desta forma com os frameworks que estou usando? =/

Abraço!

na verdade nesse caso o que vc precisa é o coneito de composição over herença… ou seja

class PessoaFisica

Funcionario tem uma PessoaFisica, logo

class Funcionario { PessoaFisica pessoaFisica; FuncionarioTipo tipo; //outor campos }

enum FuncionaoTipo { GERENTE,OUTROTIPO,ETC; }

Aonde a interface é boa ? a interface é boa pra algo como Usuario, um usuário é uma coisa comum a varios sistemas então vc pode criar uma interface para isso…

interface User { String getLogin(); String getSenha(); //normalmente isso retorna uma senha criptografada boolean checkSenha(String senha); //normalmente aqui vc recebe uma senha descriptografada para checar contra a sua senha. }

pq uma interface usuario ? pq vc pode usar em esquemas de login, em em varias outras partes, e assim não precisa escrever para aplicativos diferentes e pode reaproveitar… ai a ideia é legal de usar interface…

class Usuario implements User {
    private PessoaFisica pessoaFisica;
    //outros campos
}

por ai vai…

Fiz o seguinte, criei uma classe interface User, uma classe Cliente que implementa User e dentro da classe Cliente fiz a composição, conforme os códigos abaixo:

Classe de interface User:

public interface User {
	
	public String getLogin();
	public String getNome();
	public String getSenha();
	public String getStatus();
}

Classe Cliente que implementa User:

public class Cliente implements User {
	
	ClientePF clientePF = new ClientePF();
	ClientePJ clientePj = new ClientePJ();	
	
	private String nome;
	private String login;
	private String senha;
	private String status;
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getSenha() {
		return senha;
	}
	public ClientePF getClientePF() {
		return clientePF;
	}
	public void setClientePF(ClientePF clientePF) {
		this.clientePF = clientePF;
	}
	public ClientePJ getClientePj() {
		return clientePj;
	}
	public void setClientePj(ClientePJ clientePj) {
		this.clientePj = clientePj;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}

}

Classe ClientePF:

public class ClientePF {
		
	private Long idClientePF;
	private String cpf;
	private String nome;
	private Date dataNasc;
	private String telefone;
	private String celular;
	private String email;
	private String eCivil;
	private String profissao;
	private String endereco;
	private String bairro;
	private String cidade;
	private String estado;
	private String pais;
	private String cep;
	
	public Long getIdClientePF() {
		return idClientePF;
	}
	public void setIdClientePF(Long idClientePF) {
		this.idClientePF = idClientePF;
	}
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public Date getDataNasc() {
		return dataNasc;
	}
	public void setDataNasc(Date dataNasc) {
		this.dataNasc = dataNasc;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	public String getCelular() {
		return celular;
	}
	public void setCelular(String celular) {
		this.celular = celular;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String geteCivil() {
		return eCivil;
	}
	public void seteCivil(String eCivil) {
		this.eCivil = eCivil;
	}
	public String getProfissao() {
		return profissao;
	}
	public void setProfissao(String profissao) {
		this.profissao = profissao;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public String getBairro() {
		return bairro;
	}
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}
	public String getCidade() {
		return cidade;
	}
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}
	public String getEstado() {
		return estado;
	}
	public void setEstado(String estado) {
		this.estado = estado;
	}
	public String getPais() {
		return pais;
	}
	public void setPais(String pais) {
		this.pais = pais;
	}
	public String getCep() {
		return cep;
	}
	public void setCep(String cep) {
		this.cep = cep;
	}	

}

É isso??

Abraço!