Super (hierarquia)

Pessoal, estou com problemas para utilizar o SUPER no java, me deram um código enorme e disseram para enxugá-lo usando métodos de hierarquia e polimorfismo, consegui diminuir uma 50 linhas e melhorar alguns métodos, mas ainda estou em dúvida se usei de forma correta o SUPER e se há como enxugar mais o código.

codigo:

[code]class Funcionario{
char nome[],
data_nascimento[],
data_admissao[];
int departamento;
double salario,
previdencia = 0.05;

Funcionario(char nom[],char dn[],char da[],int dp,double sal){
 	nome=nom;
	data_nascimento=dn;
	data_admissao=da;
	departamento=dp;
	salario=sal;
}

}
class boy{
extends Funcionario{
double desconto_boy=0.02;
boy(char nom[],char dn[],char da[],int dep,double sal, desconto_boy){
super(nom, dn, da, dep, sal);
this.desconto_boy=desconto_boy;
}
}

void altera_desconto(double novo_desconto){
	desconto_boy=novo_desconto;
}

double pagamento(){
// Calcula o salário líquido
	return(salario*(1-previdencia-desconto_boy));
}

}
class chefe_de_boy{
extends boy{
double adicional_chefia_boy=0.10;

chefe_de_boy(char nom[],char dn[],char da[],int dep,double sal, double adicional_chefia_boy){
	super(nom, dn, da, dep, sal);
	this.adicional_chefia_boy=adicional_chefia_boy;
}
}
	
void altera_adicional(double novo_adicional){
	adicional_chefia_boy=novo_adicional;
}

double pagamento(){
// Calcula o salário líquido
	return(salario*(1-previdencia-
                       desconto_boy+adicional_chefia_boy));
}

}
class secretaria{
extends Funcionario{

secretaria(char nom[],char dn[],char da[],int dep,double sal){
	super(nom, dn, da, dep, sal);
	
double pagamento(){
// Calcula o salário líquido
	return(salario*(1-previdencia));
}
}

}
class afastado{ // Funcionário afastado
extends Funcionario {

char data_afastamento[];

afastado (char nom[], char dn[], char da[], char d_afasta[], int dp) 
{
 	super(nom, dn, da, dp);
	this.data_afastamento=d_afasta;
	salario= 0.0;
}
}

double pagamento(){
   return(salario);
}

}
class contador{
extends Funcionario {;
double
desconto_sindicato=0.1,
adicional_contabilidade=0.10;

contador(char nom[],char dn[],char da[],int dep, double sal){
 	super(nom, dn, da, dep, sal);
}
}

void altera_contribuicao(double nova_contribuicao){
	desconto_sindicato=nova_contribuicao;
}
void altera_adicional(double novo_adicional){
	adicional_contabilidade=novo_adicional;
}
double pagamento(){
// Calcula o salário líquido
	return(salario*(1-previdencia-
                       desconto_sindicato+adicional_contabilidade));
}

}

class presidente{
extends Funcionario {

double adicional_periculosidade=0.3,
       adicional_whisky=0.9,
       adicional_helicoptero=0.7,
       adicional_adicional=3.8;

presidente(char nom[],char dn[],char da[],int dep,
double sal){
 	super(nom, dn, da, dep, sal);
}
}

void altera_adicional(double novo_percentual){
       adicional_periculosidade=0.3*(1+novo_percentual);
       adicional_whisky=0.9*(1+novo_percentual);
       adicional_helicoptero=0.7*(1+novo_percentual);
       adicional_adicional=3.8*(1+novo_percentual);
}
double pagamento(){
// Calcula o salário líquido
	return(salario*(1-previdencia+
	 adicional_periculosidade+
         adicional_whisky+
         adicional_helicoptero+
         adicional_adicional));
	}

}

class cadastro_n_funcionarios{
public static void main(String args[]){
boy Vagal = new boy (“Vagal da Silva Sauro”, “01/01/1981”, “03/03/1997”, 45, 350.00, 0.03);
chefe_de_boy Arthas = new chefe_de_boy (“Arthas the Killer”, “04/10/1973”, “03/06/1995”, 45, 750.00, 0.5);
secretaria Totosa = new secretaria (“Totosa Sabe Nada”, “04/09/1978”, “07/03/1998”, 76, 1800.00);
afastado Vacilo = new afastado (“Vacilo Franciscano”, “08/02/1967”, “03/09/1997”, “02/01/2003”);
contador Mercenario = new contador(“Mercenario Rosa”, “03/03/1967”, “03/03/1994”, 65, 2300.00);
presidente Mordor = new presidente (“Mordor King do Mal”, “21/08/1959”, “03/03/1989”, 01, 15000.00);
}
}
}[/code]

Bom… também num sou nenhum Mr. Java…
Mas to tentando ajudar… enquanto eu transformo seu código em algo legível aqui ehheheh :slight_smile: percebi umas coisas como:
“class boy{ extends Funcionario{”
Tipow… primeiro, classes deveriam começar com maiúsculas “class Boy”, isso facilita a ler seu código, segundo que creio que não funciona, deveria ser “class Boy extends Funcionario {”…

Outras coisas como “nome=nom” poderia ser usado “this.nome=nome” como vc usou algumas vezes… isso gera menos nomes de variáveis pras mesmas coisas… fora que fica mais bunitinhu coisa do tipo “data = data” ao invés de tudo misturado “data_seiladuque=data_seiladaonde” com espaços e tals… bom… deixando a perfumaria de lado to tentando te ajudar aqui… mas acredito que os Deuses do Java vão te ajudar fácil em breve… :slight_smile:
Guenta aí que já posto alguma coisa…

pois amigão… estou me embananando com isso mesmo… o método this, super… pelo simples fato da falta de experiência… estou me enrolando neste aspectos…

mas agradeço muito desde já!!!

um abraço!!!

Veja que o método pagamento existe em todos as classes … o mais básico é:

return(salario*(1-previdencia));

Em alguns casos ele possui desconto e em outros adicionais … o que eu acho que você poderia fazer é o seguinte …

definir mais dois atributos na classe funcionario: desconto e adicional … colocar estas duas variáveis no construtor da classe funcionario … aí qdo vc criar um objeto de uma classe q nao tem desconto por exemplo vc passa para o construtor da superclasse (funcionario) o valor zero … o mesmo vc faria com o desconto … aí o método pagamento que existe em todas as classes poderia ficar só na classe funcionario pq qdo escolhesse uma classe sem desconto ou adicional as variaveis estariam valendo zero:

return(salario*(1-previdencia-desconto+adicional));

Sei lá … foi uma coisa assim que imaginei …

:!: uma outra dica … nao use _ (underline) em nome de variaveis por exemplo … ao invés de nome_curso o padrão é nomeCurso …

:!: costume definir métodos get e set … nao dê acesso direto a suas variáveis … por exemplo ao invés de deixar o atributo salário como public crie o método setSalario qdo quiser alterar o valor do salrio e getSalario quando quiser ler …

é isso … espera mais gente te dar dicas … t+

Olha só… consegui deixar curtinho… hehehe
MAAAAAS o problema é que não acho que usei exatamente o que você esperava… :frowning:
Usei métodos sobeescritos… e “alterei” umas coisinhas… mas acho que tem a mesma funcionalidade no final das contas… bom, sei lá, dá uma olhada e vê o que você acha, derrepente agente pode trabalhar melhor…

class Funcionario {
	String	nome,
			data_nascimento,
			data_admissao,
			data_afastamento;
	int 	departamento;
	double 	salario,
			previdencia = 0.05,
			modificador;

	int		nivelSalarial = 0;
	double	desconto_sindicato = 0.1,
			adicional_contabilidade = 0.10,
			adicional_periculosidade = 0.3,
			adicional_whisky = 0.9,
			adicional_helicoptero = 0.7,
			adicional_adicional = 3.8;

	Funcionario(String nome, String data_nascimento, String data_admissao, int departamento, double salario, double modificador, int nivelSalarial) {
		this.nome = nome;
		this.data_nascimento = data_nascimento;
		this.data_admissao = data_admissao;
		this.departamento = departamento;
		this.salario = salario;
		this.modificador = modificador;
		this.nivelSalarial = nivelSalarial;
	}

	Funcionario(String nome, String data_nascimento, String data_admissao, int departamento, double salario, String data_afastamento) {
		this.nome = nome;
		this.data_nascimento = data_nascimento;
		this.data_admissao = data_admissao;
		this.departamento = departamento;
		this.salario = salario;
		this.data_afastamento = data_afastamento;
	}

	void altera_modificador(double modificador) {
		this.modificador = modificador;
	}

	void altera_adicional(double novo_percentual) {
		adicional_periculosidade = 0.3 * (1 + novo_percentual);
		adicional_whisky = 0.9 * (1 + novo_percentual);
		adicional_helicoptero = 0.7 * (1 + novo_percentual);
		adicional_adicional = 3.8 * (1 + novo_percentual);
	}

	void altera_contribuicao(double nova_contribuicao){
		desconto_sindicato = nova_contribuicao;
	}

	void altera_adicional_contabilidade(double novo_adicional){
		adicional_contabilidade = novo_adicional;
	}


	double pagamento() {
		double salarioFinal = 0.0;

		if(nivelSalarial == 1) {
			salarioFinal = salario * (1 - previdencia - desconto_sindicato + adicional_contabilidade);

		} else if(nivelSalarial == 2) {
			salarioFinal = salario * (1 - previdencia + modificador	+ adicional_periculosidade +
							adicional_whisky + adicional_helicoptero + adicional_adicional);

		} else {
			salarioFinal = salario * (1 - previdencia + modificador);
		}

		return salarioFinal;
	}
}

class Cadastro_n_Funcionarios{
	public static void main(String args[]) {
		Funcionario	vagal 		= new Funcionario 	("Vagal da Silva Sauro","01/01/1981", "03/03/1997", 45, 350.00, 	-0.03, 0);
		Funcionario arthas 		= new Funcionario 	("Arthas the Killer", 	"04/10/1973", "03/06/1995", 45, 750.00, 	0.5, 0);
		Funcionario totosa 		= new Funcionario 	("Totosa Sabe Nada", 	"04/09/1978", "07/03/1998", 76, 1800.00, 	0.0, 0);
		Funcionario vacilo 		= new Funcionario	("Vacilo Franciscano", 	"08/02/1967", "03/09/1997", 00, 0, 			"02/01/2003");
		Funcionario mercenario 	= new Funcionario	("Mercenario Rosa", 	"03/03/1967", "03/03/1994", 65, 2300.00,	0.0, 1);
		Funcionario mordor 		= new Funcionario 	("Mordor King do Mal", 	"21/08/1959", "03/03/1989", 01, 15000.00,	0.0, 2);
	}
}

Uma observação importante: adicional adicional foi o máximo!! huhuahuahu deixa meu chefe ver isso… hehehe

Uma coisa boba, mas ao invés de usar vários if’s para verificar o nível salarial, use um switch.

Antes de mais nada, voce sabe quando usar super() e quanto usar this()? Sabe como eh o funcionamento de cada uma? sem tais conceitos nao adianta muita coisa um codigo menor e mais bonito que voce nao entende a metade ( nao que os codigos postados pelos colegs estajam errados, pelo contrario. )

O funcionamento de super() eh bastante simples: ele chama o metodo equivalente da classe pai, nada mais que isso. this() chama o metodo da mesma classe ( a que voce esta trabalhando ).

Vale notar que, em construtores, super() percorre toda a hierarquia de classes. por exemplo, digamos que voce tenha o codigo

// Vidinha.java
class Vovo
{
	public Vovo()
	{
		System.out.println("Vovo");
	}
}

class Papai extends Vovo
{
	public Papai()
	{
		super();
		System.out.println("Papai");
	}
}

class Filinho extends Papai
{
	public Filinho()
	{
		super();
		System.out.println("Filhinho");
	}
}

public class Vidinha
{
	public static void main(String args[])
	{
		Filinho f = new Filinho();
	}
}

Qual sera o resultado da execucao deste programa? Sera

Vovo
Papai
Filhinho

Note que mesmo que tivessemos omitido a chamada a super() o resultado seria o mesmo. Porque? por que o Java encarrega-se de realizar tal chamada, caso voce nao a faca. Vale lembrar que super() ( ou this ) devem ser a primeira instrucao no construtor, caso contrario ira ocasionar em erro de compilacao.

Voce voce quiser chamar o metodo da classe pai em algum metodo da classe filha, use a forma

super.nomeDoMetodo();

ou seja, a palavra-chave “super” seguido do nome do metodo da classe pai.

Rafael

Leandro… nem tenho como agradecer…o código ficou enxutão… estou comparando com o que eu tinha… e putz… deu um grande salto… valeu mesmo!!!

Rafael, eu sei sim na teoria como o Super e o This funcionam, mas eu estava com problema em implementá-los ná pratica… o programa exemplo que vc colocou me ajudou bastante, mas tenho uma dúvida:

Se o seguinte bloco de código não existisse, o programa daria erro por não haver nenhum objeto instanciado??? Ou rodaria mesmo assim???

public class Vidinha { public static void main(String args[]) { Filinho f = new Filinho(); }

Um abração e mais uma vez agradeço a todos!!!

[/code]

Ele roda, mas nao eh mostrado saida alguma.

Rafael

Sem o método main, nada aparece na sua tela.