[Resolvido] Como implementar métodos de classes abstratas com variáveis private

6 respostas
lucianodacunha.net

Olá pessoAll,

Em classes abstratas nem todos os métodos precisam ser abstratos, mas os que assim forem, será preciso implementá-los.

Nesse caso, como inicializar as variáveis de instância que são private, e que têm seus valores inicializados no construtor da superclasse com métodos set;

Por exemplo:
public abstract class Funcionario{

	private String nome;
	private String cpf;
	private double salario;
		
	public Funcionario(String nome, String cpf, double salario){
	
		setNome(nome);
		setCpf(cpf);
		setSalario(salario);	
	
	}	
	
	// Todos os outros métodos set e get não necessariamente abstratos.
	
	public abstract void setSalario(double salario);	

}

public class Gerente extends Funcionario{
	
	public Gerente(String nome, String cpf, double salario){
		
		super(nome, cpf, salario);
		
	}
	
	// Como implementaria esse método...?
	public void setSalario(double salario){
	
		//???
	
	}	

}
...utilizar modificadores protected ajudaria em algo??

[]'s

6 Respostas

M

Olá khadi.

Talvez não seja a melhor opção tornar os métodos setters e getters abstract, pois eles são os meios de comunicação com os atributos da classe. As boas práticas pregam que os atributos devem mesmo ser private. Uma melhor abordagem seria dar uma definição padrão desses métodos na classe pai e, então, sobrescrever em cada classe filha para dar uma implementação mais específica. Pois, se você colocar os atributos como protected, outras classes do mesmo pacote poderiam modificar os valores dos atributos diretamente.

vitimnunes

não é mesmo uma boa idéia tornas os setter e getters abstratos, melhor seria se você os sobrescrevesse nas subclasses se necessário, mass…
se ainda assim, você tiver que fazê-lo por uma razão qualquer, declarar os atributos nas subclasses como private e não na superclasse ou ainda
declarar os atributos da superclasse como protected ao invés de private vai ficar susse.

lucianodacunha.net

…blz pessoAll,

valew pelas dicas!

[]'s

ViniGodoy

Repita comigo:
Nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca, nunca chamarei métodos que não sejam final ou static no meu construtor.

O comportamento polimórfico não é garantido no construtor. Lembre-se que quando você chamou um método sobrescrito no construtor do pai, o filho ainda não está construído e isso pode te levar a erros bizarros e dificílimos de detectar e corrigir.

O mesmo problema ocorre ao passar “this” como parâmetro para alguém no construtor da classe.

thiagobaptista

Por que cargas d´água alguem faria um setter abstrato???

Sério, você fez essa pergunta apenas de curiosidade ou você de fato viu isso em algum software de verdade, em produção?!

\//

lucianodacunha.net

ViniGodoy diz:

…nunca chamarei métodos que não sejam final ou static no meu construtor! :slight_smile:

thiagobaptista diz:

…rs, tudo isso originou de classes que peguei como exemplo em um livro do Deitel, onde ele orientava validar os dados antes de setas os campos da instância. Mas essas classes não estavam sendo empregadas no ensino do conceito de “abstract”.

Como reaproveitei-as para testar um método abstrato, tive que deixar a classe toda como abstract…e assim tudo começou…

Mas que bom que vcs deram suas opiniões…agora sei as consequências de tal erros em diversos aspectos!

Mais uma vez, muito obrigado.

Criado 19 de setembro de 2010
Ultima resposta 20 de set. de 2010
Respostas 6
Participantes 5