Sobrescrição de métodos de uma classe abstrata [Resolvido]

3 respostas
VantuilJose

Pessoal, tô com o seguinte problema:

Tenho essa classe aqui

public abstract class DaoPadrao {

    private Banco banco;


    public DaoPadrao(){
        banco = new Banco();
    }

    public Banco getBanco(){
        return banco;
    }
    public void setBanco(Banco banco){
        this.banco = banco;
    }

    public String getDataLancamento(){
        return (new SimpleDateFormat("dd/MM/yyyy")).format(new Date());
    }

    public String getHoraLancamento(){
        return (new SimpleDateFormat("HH:mm:ss")).format(new Date());
    }

    public String getUsuario(){//Esse método ainda naum está pronto, deve retornar o usuário que está atualmente utilizando o sistema
        return "Usuário Não implementado";
    }
   
    public List<EntidadeSimples> getLista(){ //Retorna um lista de objetos de qualquer tipo que seja filha de EntidadeSimples
          //Implementação irrelevante
    }

    public  List<EntidadeSimples> getLista(String campoPesquisa, String chavePesquisa){
               //Implementação irrelevante
    }

    public void excluir(EntidadeSimples es) throws SQLException {
        //Implementação irrelevante
    }

    public EntidadeSimples getByID(int id) throws SQLException { //Pega o elemento pelo código
        //Implementação irrelevante
    }



    public abstract String getNomeTabela() ;//Garante que a classe saiba o nome da tabela que deverá atuar

    public abstract EntidadeSimples populate(ResultSet rs) throws SQLException ;//Popula um objeto com os dados do banco - Deve ser sobrescrito

    public abstract void atualizar(EntidadeSimples esVelha, EntidadeSimples esNova) throws SQLException;

    public abstract void salvar(  EntidadeSimples p) throws SQLException;
}

E essa outra aqui:

public class CidadeDAO extends DaoPadrao{
 
    private EntidadeSimplesDAO paisDao = new EntidadeSimplesDAO(EntidadeSimplesDAO.PAISES);
    private EstadoDAO estadoDao = new EstadoDAO();


 public void salvar(Cidade c) throws SQLException {   
      //Implementação irrelevante
    }



    public void atualizar(Cidade cVelha, Cidade cNova) throws SQLException {
        //Implementação irrelevante
    }

    //Garante que a classe saiba o nome da tabela que deverá atuar
    public String getNomeTabela() {
        return "Cidades";
    }


    public EntidadeSimples populate(ResultSet rs) throws SQLException{
         //Implementação irrelevante
    }
}

Mas o compilador está falando que eu tenho que sobrescrever os métodos salvar() e atualizar()…
Tem como eu sobrescrever métodos com subtipo da classe pai?
Tem uma forma de sanar esse problema?

3 Respostas

Marky.Vasconcelos

Voce pode usar Generics.

public abstract class DaoPadrao<T> {
    public abstract void salvar(T objeto) throws SQLException;
}

E na filha.

public class CidadeDAO extends DaoPadrao<Cidade> {
  public void salvar(Cidade c) throws SQLException {   
      //Implementação irrelevante
    }
}

Nesse caso funciona, e voce pode até usar Generics nos outros métodos também.

F

VantuilJose, boa tarde!

Caso você tenha a necessidade de restringir o uso dos métodos em questão para somente aceitarem subclasses de EntidadeSimples, você pode fazê-lo via Generics mesmo, da seguinte maneira:

public abstract class DaoPadrao<T extends EntidadeSimples> {

    //...

    public abstract void salvar(T entidade) throws SQLException;

    //...
}

Nas subclasses de DaoPadrao, basta manter como disse o Mark_Ameba.

Dessa maneira, caso seja passado um tipo não esperado o compilador acusará. O que é vantagem para você.

Abraço e espero ter ajudado!

VantuilJose

Problema resolvido, foi só unir as duas idéias…

Já falei que tenho que estudar generics… Mas nunca me sobra tempo… Aí o pessoal do Guj é que paga o pato… heheheehe
Valeu Pessoal

Criado 18 de fevereiro de 2010
Ultima resposta 18 de fev. de 2010
Respostas 3
Participantes 3