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.
implicit super constructor Pessoa() is undefined. Must explicitly invoke another constructor.
Fexx
Março 5, 2012, 4:39pm
#4
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
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;
}
}
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.
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!
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.