Como posso diferenciar as filha e retornar seus atributos?

Eu queria saber se há uma maneira de eu diferenciar Gerente do Vendedor nesse caso

static void imprimeFolha(Funcionário[] func) {
  String folhaPagamento= "";
  
  for (int i = 0; i < CadastroFuncionários.quantFuncionários; i++) {
    folhaPagamento = folhaPagamento + func[i].nome + "/" + func[i].codigo + "/" + func[i].salario;
    // eu gostaria de saber se na linha acima através de funcionário eu poderia ordenar o retorno de um atributo de vendedor ou gerente.
    System.out.println(folhaPagamento);
  }
}

Depende da forma como vc modelou as classes.

  • Se estiver usando herança, vc pode usar o instanceof:
if (func[i] instanceof Gerente) {
  // é gerente
} else if (func[i] instanceof Vendedor) {
  // é vendedor
} else {
  // é um outro tipo de funcionário
}

  • Ou se vc criou alguma propriedade que indique o tipo:

Nesse exemplo, estou imaginando o enum TipoFuncionario para manter os tipos possíveis

public class Funcionario {
  // outros campos
  private TipoFuncionario tipo;

  public boolean isGerente() {
    return tipo == TipoFuncionario.GERENTE;
  }

  public boolean isVendedor() {
    return tipo == TipoFuncionario.VENDEDOR;
  }
}

E vc verificaria assim:

if (func[i].isGerente()) {
  // é gerente
} else if (func[i].isVendedor()) {
  // é vendedor
} else {
  // é um outro tipo de funcionário
}

Obs.: Reparei que vc usou acento no nome da classe. Recomendo tirar, pq não é uma boa prática.

obrigado pela ajuda, eu estava realmente usando herança e eu tirar os acentos, de novo, obrigado!.

So tenho mais uma dúvida, eu tenho um atributo dentro de gerente que eu gostaria de acessar e retornar com o Get, existe alguma forma de eu fazer isso através do fun[i].

Com instanceof, vc tb conseguiria fazer assim, que acho mais elegante:

public class Funcionario {
  // propriedades

  public boolean isGerente() {
    return this instanceof Gerente;
  }

  public boolean isVendedor() {
    return this instanceof Vendedor;
  }
}

Após verificar que é um Gerente, vc pode fazer o cast e acessar o método:

if (func[i].isGerente()) {
  Gerente gerente = (Gerente) func[i];
  gerente.metodoDoGerente();
}

Em vez de usar herança pra isso, por que não cria um campo cargo na classe Funcionario? Aí o valor deste campo indica se é gerente, vendedor, etc.

Nem tudo precisa de herança, muitas vezes é melhor usar composição - é um assunto amplo e você pode ler mais a respeito aqui, aqui, aqui.

1 curtida

Eu discordo. Uma classe não deveria saber detalhes sobre as suas classes filhas (quais são, o que fazem, etc). Na maioria das vezes isso denota uma falha no design da aplicação.

Claro que há exceções (como as sealed classes, presentes nas versões mais novas da linguagem), mas para a maioria dos casos (inclusive o deste tópico), eu não acho que é a melhor opção (ainda fico com minha sugestão na mensagem anterior, de que nem deveria usar herança pra começo de conversa).

Aqui tem uma discussão mais detalhada sobre isso.