Polimorfismo no DAO

5 respostas
El11

Alo people, tenho um problema com polimosrfismo, que nao estou a compreender.

Codigo1
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);
}
Codigo2
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
Codigo3 é trecho um da classe ClienteDAO, que tambem implementa a interface (Codigo1)
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");
		}

	}

Uma vez que a Cliente implementa Modificavel. Porque a linha statement.setString(1, cliente.get.Nome()); gera erro?

5 Respostas

jpjcjbr

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();
A

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

nel

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.

El11

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

}
romarcio

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.

Criado 28 de setembro de 2011
Ultima resposta 28 de set. de 2011
Respostas 5
Participantes 5