Estou tentando fazer o seguinte exemplo:
public class PrincipalFuncionario {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int qtdFunc;
System.out.println("Quantidade de funcionarios a cadastrar:");
qtdFunc = sc.nextInt();
Funcionario f = new Funcionario();
f.lista_func = new Funcionario[qtdFunc];
int escolha = 0;
do {
System.out.println("Escolha a opção:\n1-Cadastrar\n2-Localizar\n3-Sair");
escolha = sc.nextInt();
switch (escolha) {
case 1:
f.cadastrar();
break;
case 2:
f.localizar();
break;
case 3:
System.exit(0);
}
} while (escolha <= 3);
}
}
public class Funcionario{
Funcionario[] lista_func;
protected String nome;
protected String cpf;
protected double salario;
private int cont=0;
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getNome() {
return nome;
}
public double getSalario() {
return salario;
}
Funcionario(){
}
Funcionario(String nome, String cpf, double salario){
this.nome = nome;
this.cpf = cpf;
this.salario = salario;
}
void mudarNome(String nome){
this.nome = nome;
}
void mudarSalario(double salario){
this.salario = salario;
}
void mostra(){
System.out.println("Nome: "+this.nome+"\nCPF: "+this.cpf+"\nSalario: "+this.salario);
}
void cadastrar(){
Scanner sc = new Scanner(System.in);
System.out.println("Que tipo de funcionario deseja cadastrar?\n1-Gerente\n2-Supervisor\n3-Atendente");
int tipo = sc.nextInt();
if (cont < lista_func.length){
switch(tipo){
case 1: lista_func[cont] = new Gerente();
case 2: lista_func[cont] = new Supervisor();
case 3: lista_func[cont] = new Atendente();
}
Bonifica b = new Gerente();
System.out.println("Nome do Funcionario:");
lista_func[cont].mudarNome(sc.next());
System.out.println("CPF do Funcionario:");
lista_func[cont].setCpf(sc.next());
System.out.println("Salario do Funcionario:");
lista_func[cont].mudarSalario(sc.nextDouble());
cont++;
}else{
System.out.println("Quantidade Limite Atingida!");
}
}
void localizar(){
Scanner sc = new Scanner(System.in);
boolean achou = false;
System.out.println("Digite o nome:");
String nfunc = sc.next();
for (int i=0;i<cont;i++){
if (lista_func[i].getNome().equals(nfunc)){
int esc=0;
System.out.println("1-Mudar Nome\n2-Mudar Salario\n3-Bônus");
esc = sc.nextInt();
switch(esc){
case 1: System.out.println("Digite o novo nome:");
lista_func[i].mudarNome(sc.next());break;
case 2: System.out.println("Digite o novo salario:");
lista_func[i].mudarSalario(sc.nextDouble());break;
case 3: System.out.println("Valor do bonus:");
//
//
//
}
achou = true;
}
if (!achou){
System.out.println("Registro não encontrado!");
}
}
}
}
public class Gerente extends Funcionario implements Bonifica{
public void bonifica(double valor){
this.salario = this.salario + this.salario * 18/100 + valor;
}
}
public class Supervisor extends Funcionario implements Bonifica{
public void bonifica(double valor){
this.salario = this.salario + this.salario * 15/100 + valor;
}
}
public interface Bonifica {
public void bonifica(double valor);
}
Na classe Funcionario no case 3, preciso chamar o metodo bonifica de acordo com o objeto - Gerente / Supervisor, mas não estou conseguindo.
Alguém pode me ajudar?
Desculpem o codigo grande.

