Polimorfismo no DAO

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?

Gera erro porque seu objeto cliente está sendo referenciado por uma variável do tipo Modificavel.

Variáveis de referências do tipo Modificavel não possuem o o método getNome. Neste caso você deveria fazer:

Cliente cliente = new Cliente();

Caro El
porque
statement.setString(1, cliente.get.Nome());,

não seria

statement.setString(1, cliente.getNome());

sem o ponto entre o get e o nome

Oi,

cade o polimorfismo ai que não estou vendo ? :slight_smile:
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).

Abraços.

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 :smiley: 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;
}

}[/code]

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.