Olá pessoal, estou tentando implementar alguns exemplos de herança, até que me deparei com a seguintesdúvida:
1 - Não posso chamar o construtor de uma classe abstrata dentro de uma classe filha?
vejam meu código
// pacote de classe relacionado a pessoas
package PESSOA;
public abstract class Pai {
//atributos membro da classe
private String tratamento;
//construtor
public Pai(String tratamento){
setTratamento(tratamento);
}
// método de configuração
public void setTratamento(String tratamento){
this.tratamento=tratamento;
}
}
classe que herda de pai
// classe que herda de pai
package PESSOA;
import PESSOA.Pai;
public class Filho extends Pai{
private int num;
public Filho(int num){
//super(tratamento);
setInt(num);
}
public void setInt(int num){
this.num=num;
System.out.println(num);
}
}
vejam que na linha 11 (da classe filha) se eu tirar o comentário tenho o seguinte problema
Filho.java:11: tratamento has private access in PESSOA.Pai
ok, se trata de um atributo privado de pai, porém no construtor pai eu pedi para utilizar o método público setTratamento
se eu comentar o super (como no código) tenho o seguinte erro
pessoa\Filho.java:10: cannot find symbol symbol : constructor Pai() location: class PESSOA.Pai".
Eu crio as variáveis privadas na classe abstrata e crio um método construtor para ser chamado nas classes filhas utilizando os métodos de configuração (setters).
Será esse meu erro (lógica) ou é erro de sintese da linguagem que eu estou cometendo?
Vc pode sim usar o construtor de uma classe que vc esteja estendendo… o problema ae é outro, olhe que a classe pai tem um atributo chamado “tratamento” que é private, e no contrutor da filha vc recebe um “num” e tenta passar um “tratamento” para o construtor, o problema é que esta variável “tratamento” não existe na filha, então o compilador entende que vc está tentando usar a “tratamento” da classe pai, dae o erro.
Putz cara, então era o que eu temia, pois a minha idéia era justamente essa, pegar o atributo encapsulado de pai e usar o set de pai dentro do seu construtor para chama-lo na classe filha.
Vou ter de mudar totalmente minha construção das classes desse jeito
PÕ, é, não vai rolar, a não ser que vc mude o atributo da classe pai para “protected”, dae vai…
Mas se mal lhe pergunte, pra que vc quer fazer isto… pq o atributo da classe pai estará sempre nulo… e não irá alterar nada… ou vc pode usar o set da classe pai dentro do contrutor da classe filha, sem problemas
Eu queria fazer o seguinte, usar o super na filha, ai quando eu fosse instanciar eu faria:
Filha obj= new Filha(argumento tratamento, argumento numero)
Minha idéia é reaproveitar o código, pois isso é um exemplo, minha classe real tem uns 10 atributos então eu poderia reaproveitar todos esses set’s da pai em duas classes que eu iria criar, além de usar as arguments exceptions que eu iria implementar na classe pai entende.
Então… acho que vc está se confundindo… mas para isto que vc quer dá sim… e tô pra te dizer que para isto que tem esta parada de reaproveitar o construtor… vc só se confundiu um pouco… olha o exemplo:
[code]
public abstratc class Pai{
private String tratamento;
public Pai(String tratamento){
this.tratamento = tratemento;//vc pode setar direto, não precisa usar o set, mas se quizer usa-lo pode.
}
}
public class Filha extends Pai{
private String qqCoisa;
public Filha(String qqCoisa, String tratamento){ // olhe que aqui vc tem um parametro “tratamento”
super(tratemento);//por vc ter um parametro tratamento, o compilador vai entender
this.qqCoisa = qqCoisa;
}
}[/code]