ArrayList + Classe Abstrata + Herança

9 respostas
J

Boa tarde gente, sou novo no forum, e gostaria de uma ajuda suas.
Estou com um projeto de faculdade para fazer e estou com uma duvida cruel que nao consigo resolver.

Tenho uma classe pessoa.
public abstract class Pessoa implements Comparable<Pessoa>{
	
	public static final int CLIENTE = 1;
	public static final int VENDEDOR = 2;
	public static final int FORNECEDOR = 3;
	
	private int codigo;
	private String nome;
	private String telefone;
	private String email;
	private GregorianCalendar dataCad;
	
	public Pessoa(int codigo, String nome, String telefone, String email,
			GregorianCalendar dataCad) {
		super();
		this.codigo = codigo;
		this.nome = nome;
		this.telefone = telefone;
		this.email = email;
		this.dataCad = dataCad;
	}
GET E SET estão implementados.
	
        public abstract int getTipo();
	
	public int compareTO(Pessoa o){
		return nome.compareTo(o.nome);
	}

	@Override
	public String toString() {
		return  "Codigo: " + codigo + "\n" + 
				"Nome: " + nome + "\n" +
				"Telefone: " + telefone + "\n" + 
				"E-mail: " + email + "\n" +
				"Data de Cadastro: " + dataCad;
	}

Até ai tudo blz...

Dai tenho uma classa Cliente que tem com o herança a classe pessoa.
public class Cliente extends Pessoa {

	private String cpf;
	private double limiteCredito;
	
	public Cliente(int codigo, String nome, String telefone, String email,
			GregorianCalendar dataCad, String cpf, double limiteCredito) {
		super(codigo, nome, telefone, email, dataCad);
		this.cpf = cpf;
		this.limiteCredito = limiteCredito;
	}

GET E SET AQUI NO MEIO
	
	@Override
	public String toString() {
		return "CPF:" + LtpUtil.formatarCPF(cpf) + "\n" +
				"Limite Credito: " + LtpUtil.formatarValor(limiteCredito, "#,##0.00");
	}

	@Override
	public int getTipo() {
		return 1;
	}
@Override
	public int compareTo(Pessoa o) {
		// TODO Auto-generated method stub
		return 0;
	}
Obs: tenho mais duas outras classes, fornecedor e vendedor que são "filhos" da classe pessoa.

Blz, até ai tudo bem.
O problema é:

Tenho uma classe comercial que tenho que fazer todo o processamento de dado.
Dentro dela tenho que fazer uma arraylist tipo pessoa.

import java.util.ArrayList;

import dados.Pessoa;

public class Comercial {

	public static ArrayList<Pessoa> listaPessoas = new ArrayList<>();
}
Minha duvida é: Como faço a inclusão de um cliente em uma ArrayList tipo Pessoa? Inserir dados do cliente aqui.
private static void incluirCliente() {
			int codigo = 0;
			if (Comercial.listaPessoas.isEmpty()){
				codigo = 1;
			}else {
				codigo = Comercial.listaPessoas.get(Comercial.listaPessoas.size() -1).getCodigo() +1;
			}
			String nome = Console.readLine("Nome do cliente: ");
			String telefone = Console.readLine("Telefone do cliente: ");
			String email = Console.readLine("E-mail do cliente: ");
			GregorianCalendar dataCad = new GregorianCalendar();
			String cpf = Console.readLine("CPF do cliente: ");
			double limiteCredito = Console.readDouble("Limite de Credito do Cliente: ");
			try {
				Pessoa clienteNovo = new Cliente(codigo, nome, telefone, email, dataCad, cpf, limiteCredito);
				Comercial.incluirPessoa(clienteNovo);
			} catch (Exception e) {
				// TODO: handle exception
			}
			
		}
Processamento desses dados fica na classe Comercial.
public class Comercial {

	public static ArrayList<Pessoa> listaPessoas = new ArrayList<>();
	
	
	public static void incluirPessoa(Pessoa obj){
	// O QUE COLOCAR AQUI DENTRO???
        // ESSE E O MEU PROBLEMA
		
	}
Como consulto o CPF de um cliente dentro dessa ArrayLista tipo pessoa?

Não to conseguindo entender isso, obrigado pela atençao!

9 Respostas

Nicolas_Fernandes
Você deve verificar se o objeto é do tipo Cliente e, depois, converter a Pessoa em Cliente e assim verificar o resultado.
List<Pessoa> pessoas = new ArrayList<Pessoa>();

pessoas.add(new Cliente("João"));
pessoas.add(new Fornecedor("Sadia"));
pessoas.add(new Cliente("José"));
pessoas.add(new Cliente("Pedro"));
pessoas.add(new Cliente("Tiago"));
pessoas.add(new Fornecedor("Unilever"));
pessoas.add(new Fornecedor("Nestlè"));

for (Pessoa pessoa : pessoas) {
    if (pessoa instanceof Cliente) {
        Cliente cliente = (Cliente) pessoa;
        boolean cpfValido = verificarCPF(cliente.getCPF());
    }
}

Isso ajuda?
Fique com Deus! :D

J
Nicolas Fernandes:
Você deve verificar se o objeto é do tipo Cliente e, depois, converter a Pessoa em Cliente e assim verificar o resultado.
List<Pessoa> pessoas = new ArrayList<Pessoa>();

pessoas.add(new Cliente("João"));
pessoas.add(new Fornecedor("Sadia"));
pessoas.add(new Cliente("José"));
pessoas.add(new Cliente("Pedro"));
pessoas.add(new Cliente("Tiago"));
pessoas.add(new Fornecedor("Unilever"));
pessoas.add(new Fornecedor("Nestlè"));

for (Pessoa pessoa : pessoas) {
    if (pessoa instanceof Cliente) {
        Cliente cliente = (Cliente) pessoa;
        boolean cpfValido = verificarCPF(cliente.getCPF());
    }
}

Isso ajuda?
Fique com Deus! :D

Putz cara, e como me ajudo, muito obrigado mesmo, vou fazer uns testes aqui e te respondo.

Muito obrigado mesmo!
Fique com Deus!

Obrigado novamente!

ViniGodoy

Por favor, não use [Marcações] para colocar informações óbvias, como o fato de você ter uma [Dúvida Cruel].

Sem uma dúvida, você nem sequer abriria o tópico, certo?

Você pode testar os tipos das classes através do “instance of”. Entretanto, se você estiver fazendo isso com frequência, é porque provavelmente sua relação de herança está incorreta. Ou, no mínimo, o fato de você usar uma lista só para representar as várias pessoas.

J

ViniGodoy:
Por favor, não use [Marcações] para colocar informações óbvias, como o fato de você ter uma [Dúvida Cruel].

Sem uma dúvida, você nem sequer abriria o tópico, certo?


Desculpa

Fessor mando fazer com uma lista so =/
Fiz o trabalho inteiro direcionando para 3 listas, clientes fornecedores e vendedores, dai ele me vira e fala que nao pode! haha
dai eu tava com essa duvida. Mas ja consegui entender graças ao Instanceof! haha

Brigado ai!
Fique com Deus!

S

Lembre-se que sua lista só aceita objetos do tipo pessoa. Como você declarou

public class Cliente extends Pessoa {
//resto do código
}

você está dizendo que um cliente É uma pessoa portanto ele aceita numa boa.

J

Pergunta, No meu codigo, na classe pesoa existe a seguintes linhas:

public static final int CLIENTE = 1; public static final int VENDEDOR = 2; public static final int FORNECEDOR = 3;

onde vou usar e para que vou usar essas linhas?

Nicolas_Fernandes

Jorge Back:
Pergunta, No meu codigo, na classe pesoa existe a seguintes linhas:

public static final int CLIENTE = 1; public static final int VENDEDOR = 2; public static final int FORNECEDOR = 3;

onde vou usar e para que vou usar essas linhas?

Boa pergunta, meu amigo. Você colocou essas linhas e não sabe o porquê? Descubra o porquê de tê-las colocado, mas não, não faz sentido fazer uso dessas variáveis.

J

Nicolas Fernandes:

Boa pergunta, meu amigo. Você colocou essas linhas e não sabe o porquê? Descubra o porquê de tê-las colocado, mas não, não faz sentido fazer uso dessas variáveis.

Haha, no trabalho ele falou para criar essas constantes, mas eu nao entendi pra que, eu nao uso elas em momento nenhum =/

J

Acho que serve pra diferenciar entre Cliente, Vendedor e Fornecedor.

Quando for criar um desses objetos, você coloca um inteiro no construtor que represente o tipo de Pessoa.
Por exemplo, declare um inteiro de nome ‘tipo’.
Se ele for um cliente, o construtor faz: tipo = CLIENTE
ou tipo = VENDEDOR…

Ele deve ter botado isso pra não precisar usar o instanceOf

if(pessoa.tipo == CLIENTE ) ou if(pessoa.tipo == 1)
é cliente

etc

Criado 18 de outubro de 2012
Ultima resposta 19 de out. de 2012
Respostas 9
Participantes 5