Duvida Herança

Boa Tarde Galera,

Estou com uma duvida na implementação de um trabalho, tenho uma classe Pessoa com os atributos nome, data_nasc, idade e sexo.

Na criação de uma subclasse funcionário tenho um construtor com todos os atributos acima e mais atributos cargo, salario e num_func.

  [b] Funcionario(String nome,char sexo,Date datanasc,String cargo,double salario)//Construtor 1
   {
	   super(nome,sexo, datanasc);
	   this.salario=salario;
	   this.cargo = cargo;
	   num_func++;
	   
   }[/b]

Gostaria de Saber se tem como criar mais um construtor na classe funcionário para o caso de a pessoa já existir por ex:

pessoa p1 = new pessoa(nome,data_nasc,sexo)
p1 = new funcionario(cargo,salario).

Estou tentado criar este construtor da seguinte forma mas da erro:

[b]   
    Funcionario(String cargo,double salario)//Construtor 2
   {
	  
	   this.salario=salario;
	   this.cargo = cargo;
	   num_func++;
	   
   }
   
   [/b]

Desde já Agradeço.

Qual é o erro?

implicit super constructor Pessoa() is undefined. Must explicitly invoke another constructor.

Vc está deixando o compilador chamar um construtor que não existe implicitamente, nesse caso vc terá que adicionar o construtor de forma explicita, já que vc crio ele.

N entendi, vc pode dar um ex. de como eu faço isso?

No seu segundo construtor onde estão sendo setadas as três propriedades da classe Pessoa? Funcionário não herda de Pessoa?

Entao, essa é minha duvida, tem como setar estas propriedades sem passá-las como paramentros no construtor? Se tiver como posso fazer? Queria fazer isso para por ex. se ja existisse uma pessoa p e ela ainda não fosse funcionária, eu daria um p = new funcionario(cargo,salario) entende mas to com problema neste construtor.

vejo 2 formas:

um método chamado: [code]convertToFuncionario(cargo,salario){

seta o cargo,

seta o salario,

retorna funcionario.

}[/code]

Let’s go

  1. Classe Pessoa:
package br.com.camachojunior.cadeomeucafe;
import java.util.Date;

public class Pessoa {
	private String nome;
	private Integer idade;
	private Date data_nasc;
	private String sexo;
	
	
	
	public Pessoa() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public Pessoa(String nome, Integer idade, Date data_nasc, String sexo) {
		super();
		this.nome = nome;
		this.idade = idade;
		this.data_nasc = data_nasc;
		this.sexo = sexo;
	}

	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public Integer getIdade() {
		return idade;
	}
	public void setIdade(Integer idade) {
		this.idade = idade;
	}
	public Date getData_nasc() {
		return data_nasc;
	}
	public void setData_nasc(Date data_nasc) {
		this.data_nasc = data_nasc;
	}
	public String getSexo() {
		return sexo;
	}
	public void setSexo(String sexo) {
		this.sexo = sexo;
	}
	
}
  1. Classe Funcionario:
package br.com.camachojunior.cadeomeucafe;

import java.util.Date;

public class Funcionario extends Pessoa {

	private String cargo;
	private Double salario;
	private Integer num_func;
	
	
	
	public Funcionario() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Funcionario(String nome, Integer idade, Date data_nasc, String sexo) {
		super(nome, idade, data_nasc, sexo);
		// TODO Auto-generated constructor stub
	}

	public Funcionario(String nome, Integer idade, Date data_nasc, String sexo, String cargo,double salario)//Construtor 1
	{
		super(nome, idade, data_nasc, sexo);
		this.salario=salario;
		this.cargo = cargo;
		num_func++;

	}
	
	public Funcionario(String cargo,double salario)//Construtor 2
	{

		this.salario=salario;
		this.cargo = cargo;
		num_func++;

	}

	public String getCargo() {
		return cargo;
	}

	public void setCargo(String cargo) {
		this.cargo = cargo;
	}

	public Double getSalario() {
		return salario;
	}

	public void setSalario(Double salario) {
		this.salario = salario;
	}

	public Integer getNum_func() {
		return num_func;
	}

	public void setNum_func(Integer num_func) {
		this.num_func = num_func;
	} 
	
	
}

E finalmente, classe de teste:

package br.com.camachojunior.cadeomeucafe;

import java.sql.Date;

public class TesteFuncionario {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Pessoa p = new Pessoa();
		p.setNome("Camacho");
		p.setIdade(34);
		//Convertendo para java.util.Date
		java.text.DateFormat formatter = new java.text.SimpleDateFormat("dd/MM/yyyy");
		java.util.Date data = null;
		try {
			String str = "14/12/1977";
			data = (java.util.Date)formatter.parse(str);
		} catch (java.text.ParseException e) {
			e.printStackTrace();
		}
		p.setData_nasc( data );
		p.setSexo("Masculino");
		
		// Nesse ponto a pessoa já existe
		// Vamos usar o seu Construtor2...
		
		Funcionario f = new Funcionario(p.getNome(), p.getIdade(), p.getData_nasc(), p.getSexo());
		f.setCargo("Analista Desenvolvedor");
		f.setSalario(2222.22);
				
		System.out.println("===================================");
		System.out.println("Nome: " + f.getNome());
		System.out.println("Idade: " + f.getIdade());
		String dataBonita = formatter.format(f.getData_nasc());
		System.out.println("Nascimento: " + dataBonita);
		System.out.println("Sexo: " + f.getSexo());
		System.out.println("Cargo: " + f.getCargo());
		System.out.println("Salário: R$ " + f.getSalario().doubleValue());
		System.out.println("===================================");
	}

}

Abs.

Ou, SE REALMENTE for do seu agrado, podes incluir na sua classe Funcionário este construtor:

public Funcionario (Pessoa p) { super(p.getNome(), p.getIdade(), p.getData_nasc(), p.getSexo()); }

E no seu teste poderia passar o objeto como parâmetro:

Funcionario f = new Funcionario(p); f.setCargo("Analista Desenvolvedor"); f.setSalario(2222.22);

:shock:

Brigadão Camacho, só estou com uma dúvida, não entendi como funciona o super() neste construtor:

public Pessoa() {
super();
// TODO Auto-generated constructor stub
}

Esse super chama algum outro construtor?

Desde já Agradeço.

http://docs.oracle.com/javase/tutorial/java/IandI/super.html

O problema da solução do camachojr é que você vai ter 2 pessoas replicadas no sistema. Por exemplo, em um momento você cadastra a Pessoa João da Silva de CPF 123456. Se você tiver que cadastrar um o João da Silva/123456 como Funcionario, você tem que replicar os dados do objeto Pessoa no objeto Funcionario. Mesmo que isso seja feito via costrutor, ainda assim, você vai ter 2 instâncias de Pessoa com os mesmos dados, afinal, Funcionario É-UMA Pessoa. Para eliminar a duplicidade, você tem que eliminar a 1a instância de pessoa.

Particularmente, eu usaria composição nesse caso. Funcionario TEM-UMA Pessoa:

class Funcionario{
  private String cargo;
  private double salario;
  private Pessoa pessoa;

  public Funcionario(Pessoa p, String c, double s){
     pessoa = p;
     cargo = c;
     salario = s;
  }
}

Vamos somar outra frase:
2) Programe sempre para a interface, nunca para a implementação.

E então, tem-se:

1 + 2 = Strategy pattern. Good! :smiley:

Fiz do jeito que o rmendes flou e deu certo, so de um erro falando que precisava do método super() no conmctrutor mas ja arrumei. Obrigado a todos pela ajuda.