Dúvida de estrutura?

3 respostas
P

Dúvida de estrutura?

Pessoal tenhos as seguintes tabelas

pedido coluna1 coluna2 -- clienteid int references cliente | ... | | | cliente --clienteid int | tipo char(1) [f - pessoa fisica, j - pessoa juridica] | | | clientef --clienteid int references cliente | ... | | | clientej --clienteid int references cliente | ...

Tenho um objeto Pedido que tem um Cliente que tem um ClienteF caso o Cliente.Tipo seja f ou ClienteJ caso o Cliente.Tipo seja j.

Certo acontece o seguinte antes de iniciar qualquer atualização(insert/update) faço um:

Pedido.IniciarAtualização que chama um Cliente.IniciarAtualização que chama um (ClienteJ ou ClienteF).IniciarAtualização

O problema ocorre no INSERT pois

Pedido.IniciarAtualizacao(); Pedido.Cliente.Tipo = "j"; ... Pedido.Atualizar()

O problema e o seguinte no Cliente.IniciarAtualização não sei o que carregar ClienteJ ou ClienteF pois ainda não sei qual e o meu tipo de Cliente.

Vocês tem alguma boa solução para isso?

Grato,
pablo Henrique

3 Respostas

dsiviotti

Não sei se entendi bem o seu problema, mas…
Se você tem uma classe Cliente que é extendida por ClienteF e ClienteJ o método iniciarAtualizacao() em Cliente deve ser abstrato e você implementa algo como:

public class Cliente {
  protected String tipo;
  ... outros métodos e atributos ...
}

public class ClienteF extends Cliente{
public void iniciaAtualizazcao() {
  tipo = "F";
  ... etc
}
}

public class ClienteJ extends Cliente{
public void iniciaAtualizacao(){
  tipo = "J";
  ... etc
}
}

Porém não sei quem cria uma instância de Cliente. Digamos que seja um DAO qualquer. Dentro do método que retorna o Cliente você verifica se é F ou J e retorna o tipo adequado. Assim:

public class ClienteDAO {
  ... outros métodos do DAO ...
  public Cliente getCliente() { 
  // o retorno é a superclasse Cliente pois você ainda não sabe se é F ou J
  ... faz a pesquisa no banco com um sql qualquer
  ... verifica se o campo tipo é F ou J
  if (tipo.equals("F")) {
    return new ClienteF(); // retorna na verdade um ClienteF
  } else {
    return new ClienteJ(); // retorna um ClienteJ
  }
  }
}
P

“dsiviotti”:
Não sei se entendi bem o seu problema, mas…
Se você tem uma classe Cliente que é extendida por ClienteF e ClienteJ o método iniciarAtualizacao() em Cliente deve ser abstrato e você implementa algo como:

public class Cliente {
  protected String tipo;
  ... outros métodos e atributos ...
}

public class ClienteF extends Cliente{
public void iniciaAtualizazcao() {
  tipo = "F";
  ... etc
}
}

public class ClienteJ extends Cliente{
public void iniciaAtualizacao(){
  tipo = "J";
  ... etc
}
}

Porém não sei quem cria uma instância de Cliente. Digamos que seja um DAO qualquer. Dentro do método que retorna o Cliente você verifica se é F ou J e retorna o tipo adequado. Assim:

public class ClienteDAO { ... outros métodos do DAO ... public Cliente getCliente() { // o retorno é a superclasse Cliente pois você ainda não sabe se é F ou J ... faz a pesquisa no banco com um sql qualquer ... verifica se o campo tipo é F ou J if (tipo.equals("F")) { return new ClienteF(); // retorna na verdade um ClienteF } else { return new ClienteJ(); // retorna um ClienteJ } } }

Quem instancia Clientes e a classe de Pedidos

if (tipo.equals("F")) { return new ClienteF(); // retorna na verdade um ClienteF } else { return new ClienteJ(); // retorna um ClienteJ }

No caso de insert que ainda não sei o Cliente.Tipo, vai sempre retornar ClienteJ!!!

P

Resolvi tirei a classe de clientes de dentro da classe de pedidos.

Criado 13 de abril de 2004
Ultima resposta 13 de abr. de 2004
Respostas 3
Participantes 2