[RESOLVIDO] Chamada método da sub-classe!

Bom dia pessoal. :slight_smile:

A minha dúvida está decorrendo do tema em OOP chamado herança e polimorfismo.

O problema e que tenho uma super-classe chamada “Empregado”, e uma sub-classe chamada “Gerente”.
Dentro da classe “Gerente " tenho um método chamado " getSalarioTotal()”, que me retorna o salario (que declarei como uma constante), mais a comissao!

[code]public double getSalarioTotal(){
salarioTotal = salario + comissao;

	return salarioTotal;
}[/code]

Como posso invocar esse método da sub-classe, sendo que o objeto “empregados[i]” é da super-classe “Empregado”, e ele nao acha os métodos da “sub”.

[code]System.out.println("LISTANDO NA CONSOLE OS REGISTROS DO VETOR DE FUNCIONARIOS… ");

	for (int i = 0; i < contador; i++) {
		System.out.println("EMPREGADO NO REGISTRO ["+i+"] = " + empregados[i].getNome()+ "" + empregados[i].getSobreNome() );
	}
	[/code]

Não sei se fui muito claro.
estou a diposição para esclarecimentos

Obrigado. :smiley:

Ao inves de criar um objeto empregado, crie um objeto gerente.

E tambem, esse metodo getSalario nao deveria estar na classe Empregados? Visto que todos empregados tem salario…

Abraços

Olá, Blackfalcon!

Então, eu criei um objeto gerente! alias eu tenho três tipos de empregados!

-gerente
-secretaria
-programador

Estou armazenando o objeto dentro do array" empregados", mas minha duvida e de como posso listar no final do programa todos os empregados!
E como eu posso chamar os metodos da sub-classe.
Para facilitar o entendimento vou postar o parte do codigo:

import javax.swing.JOptionPane;

public class ControleFuncionarios {
	
	public static void main(String[] args) {
		
		int com = 0;
		int continua = 0; 
		int contador = 0;
		int tipo=0;
		int lingua = 0;
		String situacao;
		String atribuir;
		
		int numGerentes=0, numSecret=0, numProgram=0;

		Empregado[] empregados = new Empregado[100];

		String[] tipoFunc = {"GERENTE", "SECRETARIA", "PROGRAMADOR"};
		String[] fluencia = {"Ingles", "Italiano", "Espanhol"};

		do {
			situacao = " Existem " + contador + " Empregados cadastrados de um total de " + empregados.length + 
			"\n sao:\n" + 
			numGerentes + " Gerentes\n" +
			numSecret + " Secretarias\n" +
			numProgram + " Programadores\n" +
			"\n Deseja cadastrar um novo empregado? ";	
			
			continua = JOptionPane.showConfirmDialog(null, situacao );
			
			if (continua == 0) {
			
				
				tipo = JOptionPane.showOptionDialog(null, " O novo funcionario e um? ", " Cadastro ", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, tipoFunc, "GERENTE");
				
				if(tipo == 0) {  
					// informou que é GERENTE
					Gerente gerente = new Gerente();
					
					String nome = JOptionPane.showInputDialog(" Informe o nome do novo gerente ");
					gerente.setNome(nome);
					
					String sobrenome = JOptionPane.showInputDialog(" Informe o seu sobrenome " );
					gerente.setSobreNome(sobrenome);
					
				    String ano = JOptionPane.showInputDialog("Informe o ano de adimissao " + gerente.getNome());
				    int  a = Integer.parseInt(ano);
				    
				    String mes = JOptionPane.showInputDialog("Informe o mes de adimissao " + gerente.getNome());
				    int  m = Integer.parseInt(mes);
				    
				    String dia = JOptionPane.showInputDialog("Informe o dia de adimissao " + gerente.getNome());
				    int  d = Integer.parseInt(dia);
				    
				    gerente.setDataAdmissao(a, m, d);
					
					String tel = JOptionPane.showInputDialog("Informe o telefone de " + gerente.getNome());
					gerente.setTelefone(tel);
					
					String cpf = JOptionPane.showInputDialog("Informe o cpf de " + gerente.getNome());
					gerente.setCpf(cpf);
					
					empregados[contador] = gerente;
					numGerentes++;
					
					atribuir = " Deseja atribuir comissao ao gerente " + gerente.getNome() + "?";
					
					com = JOptionPane.showConfirmDialog(null, atribuir );
					
					if(com == 0){
						
						String comissao = JOptionPane.showInputDialog(" Qual o valor da comissao para " + gerente.getNome());
						double s = Double.parseDouble(comissao);
						gerente.setComissao(s);
					}
					
				} else if(tipo == 1) {
					// informou que é SECRETARIA
					Secretaria secretaria = new Secretaria();
					
					String nome = JOptionPane.showInputDialog(" Informe o nome da nova secretaria ");
					secretaria.setNome(nome);
					
					String sobrenome = JOptionPane.showInputDialog(" Informe o seu sobrenome " );
					secretaria.setSobreNome(sobrenome);
					// Continua assim por diante 

[code]
classe “empregado”:

import java.util.Date;

import java.util.GregorianCalendar;

public class Empregado {

private String nome;

private String sobrenome;

private double salario;

private Date dataAdmissao;

private String telefone;

private String cpf;





public void setNome(String nome){

	this.nome = nome;

}



public void setSobreNome(String sobrenome){

	this.sobrenome = sobrenome;

}



public void setSalario(double salario) {

	this.salario = salario;

}



public void setDataAdmissao( int ano, int mes, int dia) {

	GregorianCalendar calendario = new GregorianCalendar(ano, mes-1, dia);

	dataAdmissao = calendario.getTime();

	

}



public void setTelefone(String telefone) {

	this.telefone = telefone;

}



public void setCpf(String cpf) {

	this.cpf = cpf;

}





public String getNome(){

	return nome;

}



public String getSobreNome(){

	return sobrenome;

}



public double getSalario(){

	return salario;

}



public Date getDataAdmissao(){

	return dataAdmissao;

}



public String getTelefone(){

	return telefone;

}



public String getcpf(){

	return cpf;

}

[/code]

Não sei se fui muito objetivo, peço desculpas.
E agradeço a ajuda!

Abraçoss.

Dei uma pesquisada!

Uma solução seria fazer isto:

[code]for(int i = 0; i < empregados.length; i++){
if (empregados[i] instanceof Gerente);
Gerente g = (Gerente) empregados[i];

						g.get// vou pegando os metodos?
				}[/code]

seria uma solução?

Obrigado.

Então manolo, no caso, pra vc poder chamar um método da sub-classe dessa forma ele deve existir tb na superclasse. Tipo:

Empregado é a superclasse e deve possuir um método getSalario();

Todas as subclasses de Empregado devem possuir esse método tb.

Daí, vc faria um loop for como vc fez, mas só que listando todos os Empregados (ao invés de apenas gerentes).

for(Empregado empregado : empregados) {
double salario = empregado.getSalario();
}

Apesar da classe q chama o método ser do tipo Empregado, o método q eh realmente chamado é o da subclasse q sobrescreveu o método da superclasse.

Vou tentar Tiago, obrigado.

Qual a função de " : " dentro do laço for?

Abraço.

Ah! Então, esse tipo de loop for eh chamado de “for iterado”. A sintaxe

for(Elemento e : listaElementos) 

poderia ser lida como: "Para cada elemento ‘e’ dentro da lista ‘listaElementos’ ". O ‘:’ apenas faz parte da construção. =]

Olha, que joia cara! Bem mais fácil. Obrigado Tiago.

Então, deu tudo certo no código, mas sera que seria possível eu mostrar a saida em uma tela?
Não aprendi como se faz tal façanha. hauahuahuahuaua
Parece que é realizado com o JFrame, sera que alguém pode me da um help para mostrar a saida em uma janela!

[code]System.out.println("LISTANDO NA CONSOLE OS REGISTROS DO VETOR DE FUNCIONARIOS… ");

	for (int i = 0; i < contador; i++) {
		if (empregados[i] instanceof Gerente){
			Gerente ger = (Gerente) empregados[i];
			System.out.println("EMPREGADO NO REGISTRO ["+i+"] = " + ger.getNome()+ "" + ger.getSobreNome() + ger.getSalarioTotal() );
			
		}else if (empregados[i] instanceof Secretaria){
			Secretaria sec = (Secretaria) empregados[i];
			System.out.println("EMPREGADO NO REGISTRO ["+i+"] = " + sec.getNome()+ "" + sec.getSobreNome() + sec.getLingua() );
			
		}else{
			Programador pg = (Programador) empregados[i];
			System.out.println("EMPREGADO NO REGISTRO ["+i+"] = " + pg.getNome()+ "" + pg.getSobreNome()  );
			
		}[/code]

Vou modificar os métodos, e apenas um exemplo!

Obrigado.