Alo people, tenho um problema com polimosrfismo, que nao estou a compreender.
Codigo1
[code]public interface Modificavel {
public void registar(Modificavel m);
public void remover(int id);
public void removerTodos(Modificavel m);
public void editar(Modificavel m);
public Modificavel devolverObjecto(int id);
}
[/code]
Codigo2
[code]public class Cliente implements Modificavel{
private String nome, contacto, profissao;
private int id;
private String encomenda;
// getters and setters e implementacao de metodos da interface
[/code]
Codigo3 é trecho um da classe ClienteDAO, que tambem implementa a interface (Codigo1)
[code] public void registar(Modificavel m) {
Modificavel cliente = new Cliente();
String sql = "INSERT INTO cliente (nome, contacto, profissao, encomenda) VALUES (?,?,?,?)";
try {
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, cliente.get.Nome()); // erro aqui, no cliente.getNome! Afinal cliente nao é um Cliente? nao pode invocar o metodo getNome()?
statement.execute();
statement.close();
} catch (SQLException e) {
throw new RuntimeException("Bug ao inserir");
}
}[/code]
Uma vez que a Cliente implementa Modificavel. Porque a linha statement.setString(1, cliente.get.Nome()); gera erro?
cade o polimorfismo ai que não estou vendo ?
Se está tendo acesso comum ao objeto Cliente e tem o método getNome() , teoriacamente, não é para dar absolutamente nenhum erro.
1 - Que erro está ocorrendo ?
2 - Posta a classe que contém o método public void registar(Modificavel m).
Alex Scharf, foi um engano aqui no post. O correcto é sem ponto entre get.Nome(). Mas infelizmente o problema nao é era esse, porque na minha classe estava bem escrita. Ainda assim, obrigado pelo gesto.
Nel, tu como Mastar sabes que qualquer classe que implementa a interface Modificavel, contem o metodo public void registar(Modificavel m) heheheh…
Mas e assim. Este ClienteDAO e assim:
[code]public class ClienteDAO implements Modificavel{
private Connection connection;
public ClienteDAO() {
this.connection = new ConnectionFactory().getConnection();
}
@Override
public void registar(Modificavel m) {
Modificavel cliente = new Cliente();
String sql = "INSERT INTO cliente (nome, contacto, profissao, encomenda) VALUES (?,?,?,?)";
try {
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, cliente.getNome()); //erro! getNome e metodo da classe Cliente que //implemeta Modificavel
statement.execute();
statement.close();
} catch (SQLException e) {
throw new RuntimeException("Bug ao inserir");
}
}
}
@Override
public void remover(int id) {
// TODO Auto-generated method stub
}
@Override
public void removerTodos(Modificavel m) {
// TODO Auto-generated method stub
}
@Override
public void editar(Modificavel m) {
// TODO Auto-generated method stub
}
@Override
public Modificavel devolverObjecto(int id) {
// TODO Auto-generated method stub
return null;
}
Quando você faz isso:Modificavel cliente = new Cliente(); você só terá acesso aos métodos comuns entre a Interface e a classe que a Implementou. Então para ter acesso a getNome(), teria que ter a assinatura String getNome(); na interface Modificavel, para poder acessar o método da classe Cliente.