Funcionario nessa modelagem está muito abstrato. Quer dizer que você vai fazer um cadastro de um funcionairo que a principio esteja indefinido, para depois preencher os dados referentes ao cargo? Seria bem mais facil você primeiro escolher que tipo de funcionario deseja cadastrar. Mas também é possivel fazer assim.
Como penso:
Primeiro: crie a classe Funcionario, coloque todos os atributos referentes a ele.
Segundo: crie todas as classes referentes a cargo, Enfermeiro, Administrador, AuxuliarServico, Maqueiro
Terceiro: crie uma classe Cargo que receberá todas as classes referentes aos cargos
public class Funcionario {
//atributos
//setters e getters
//Objeto cargo está dentro de funcionario. Estou usando conceito de composição aqui, por isso cargo está também no construtor de Funcionario, ja que Funcionario POSSUI um cargo
Cargo cargo;
public Funcionario (Cargo cargo) {
}
}
Depois a classe Cargo
public class Cargo() {
//Essa classe aqui possuirá somente atributos do tipo de Classe, ou seja:
Enfermeiro enfermeiro;
Administrador administrador;
Maqueiro maqueiro
//Crie obrigatoriamente os setters e getters para esses atributos
}
Depois, então você cria as classes referentes aos cargos normalmente
public class Enfermeiro () {
//Atributos e metodos de enfermeiro
//setters e getters
}
… E as outras
O que acontece quando você for cadastrar um funcionario. O compilador exigirá que você crie também no seu construtor o objeto cargo.
Então, faça:
Funcionario funcionario new Funcionario(new Cargo());
Assim, você usara esse objeto para chamar metodos tanto da classe Funcionario quanto da classe Cargo
//atributos referentes somente a funcionario
funcionario.setNome();
//atributos referentes ao cargo
funcionario.getCargo().getEnfermeiro().setLotacao();
funcionario.getCargo().getEnfermeiro().setEnfermaria();
Você impute todas as classes de cargo dentro de Cargo, e ao cadastrar um novo funcionario você tem acesso a todo o sistema de classes atraves dos getters
No cadastro do funcionario, ao ter no construtor o objeto cargo, você pode escolher quem deseja cadastrar.
Supondo um menu:
switch (opcao) {
case 1://para cadatro de enfermeiro
Funcionario funcionario = new Funcionario(new Cargo());
funcionario.setNome();
funcionario.getCargo().getEnfermeiro().setSalario();
}
No caso, onde diz que Cargo não pode ser modificado. Você pode simplesmente não coloca-lo na alteração. Coloque apenas os atributos do funcionario.
funcionario.setNome();
funcionario.setSalario():
E essa parte da busca?
Para listar a soma dos salarios, isso vai depender. Você está vai usar banco de dados? Neste caso, essa soma você pode fazer usando um query do proprio banco. E as buscas também