[classe abstrata, herança, sobrescrita, polimorfismo] Crie uma hierarquia de classes para representar os diferentes tipos de funcionários de um escritório que tem os seguintes cargos: gerente, assistente, vendedor. Escreva uma classe base abstrata chamada Funcionario que declara um método abstrato:
public double calculaSalario()
Esta classe também deve definir os seguintes atributos: nome (tipo String), matricula (tipo String) e salario_base (tipo double). Use encapsulamento e forneça um construtor que recebe os valores correspondentes a serem armazenados nos respectivos atributos. Esta classe abstrata deverá ser estendida pelas outras classes representativas dos tipos de funcionários, portanto devem ser escritas as classes Gerente, Assistente e Vendedor. Em cada classe deve-se sobrescrever o método calculaSalario de forma que cálculo do salário é feito assim: O gerente recebe duas vezes o salário_base, o assistente recebe o salário_base e o vendedor
recebe o salário_base mais uma comissão definida no construtor de sua classe. Crie uma classe Teste com um método main que cria um objeto de cada tipo e os armazena em uma lista e depois calcula a folha salarial dos três funcionários e imprime o valor total. Indique quais conceitos de POO você usou e como foi usado.
recebe o salário_base mais uma comissão definida no construtor de sua classe. Crie uma classe Teste com um método main que cria um objeto de cada tipo e os armazena em uma lista e depois calcula a folha salarial dos três funcionários e imprime o valor total. Indique quais conceitos de POO você usou e como foi usado.
Passo 1
Beleza, vamos entender o que a questão está pedindo. Precisamos criar uma hierarquia de classes para diferentes tipos de funcionários de um escritório: gerente, assistente e vendedor. Vamos usar conceitos de Programação Orientada a Objetos (POO) como classe abstrata, herança, sobrescrita de métodos e polimorfismo. Para isso, vamos criar uma classe base abstrata chamada
Funcionario
com atributos nome
, matricula
e salario_base
. Essa classe terá um método abstrato calculaSalario()
que será implementado nas classes filhas (Gerente
, Assistente
e Vendedor
). No final, vamos fazer um teste criando um objeto de cada tipo, armazenando em uma lista, calculando a folha salarial total e imprimindo o valor.Passo 2
Primeiro, vamos criar a classe abstrata
Funcionario
. Como é uma classe abstrata, ela não pode ser instanciada diretamente e terá pelo menos um método abstrato que as classes filhas precisam implementar.public abstract class Funcionario {
private String nome;
private String matricula;
private double salario_base;
public Funcionario(String nome, String matricula, double salario_base) {
this.nome = nome;
this.matricula = matricula;
this.salario_base = salario_base;
}
public String getNome() {
return nome;
}
public String getMatricula() {
return matricula;
}
public double getSalario_base() {
return salario_base;
}
public abstract double calculaSalario();
}
Aqui, usamos encapsulamento para proteger os atributos, tornando-os privados e fornecendo métodos
get
para acessá-los. O método calculaSalario()
é abstrato porque cada tipo de funcionário vai calcular o salário de forma diferente.Passo 3
Agora, vamos criar as classes filhas que estendem
Funcionario
e implementam o método calculaSalario()
de acordo com as regras:Classe Gerente
O gerente recebe duas vezes o salário base.
public class Gerente extends Funcionario {
public Gerente(String nome, String matricula, double salario_base) {
super(nome, matricula, salario_base);
}
@Override
public double calculaSalario() {
return 2 * getSalario_base();
}
}
Classe Assistente
O assistente recebe o salário base.
public class Assistente extends Funcionario {
public Assistente(String nome, String matricula, double salario_base) {
super(nome, matricula, salario_base);
}
@Override
public double calculaSalario() {
return getSalario_base();
}
}
Classe Vendedor
O vendedor recebe o salário base mais uma comissão definida no construtor.
public class Vendedor extends Funcionario {
private double comissao;
public Vendedor(String nome, String matricula, double salario_base, double comissao) {
super(nome, matricula, salario_base);
this.comissao = comissao;
}
public double getComissao() {
return comissao;
}
@Override
public double calculaSalario() {
return getSalario_base() + comissao;
}
}
Aqui, na classe
Vendedor
, adicionamos um atributo comissao
e modificamos o construtor para recebê-la. O método calculaSalario()
soma o salário base com a comissão.Passo 4
Agora, vamos criar a classe de teste que vai criar objetos de cada tipo de funcionário, armazená-los em uma lista, calcular a folha salarial total e imprimir o valor.
import java.util.ArrayList;
import java.util.List;
public class Teste {
public static void main(String[] args) {
List<Funcionario> funcionarios = new ArrayList<>();
Funcionario gerente = new Gerente("Ana", "G001", 5000.0);
Funcionario assistente = new Assistente("Bruno", "A001", 3000.0);
Funcionario vendedor = new Vendedor("Carlos", "V001", 2500.0, 1500.0);
funcionarios.add(gerente);
funcionarios.add(assistente);
funcionarios.add(vendedor);
double folhaSalarial = 0.0;
for (Funcionario f : funcionarios) {
folhaSalarial += f.calculaSalario();
}
System.out.println("Folha Salarial Total: R$ " + folhaSalarial);
}
}
Nesse trecho, usamos uma lista (ArrayList) para armazenar os diferentes funcionários. Utilizamos o polimorfismo ao tratar todos os objetos como do tipo
Funcionario
, mesmo sendo instâncias de Gerente
, Assistente
ou Vendedor
. Ao chamar calculaSalario()
, o método apropriado de cada classe é executado.Resposta
Implementando as classes conforme os passos acima, a folha salarial total será calculada e impressa corretamente. No exemplo dado, com os salários e comissão definidos, a saída será:
Folha Salarial Total: R$ 11500.0
Exercícios relacionados
Crie um programa que permita ao usuário inserir uma série de inteiros em um ArrayList, calcular a soma, a média, o valor máximo e o valor mínimo dos números inseridos.
Crie a seguinte hierarquia de classes:
- Uma interface para representar qualquer forma geométrica, definindo métodos para cálculo do perímetro e cálculo da área da forma;
- Uma classe abstrata para representar quadriláteros. Seu construtor deve receber os tamanhos dos 4 lados e o método de cálculo do perímetro já pode ser implementado;
- Classes para representar retângulos e quadrados. A primeira deve receber o tamanho da base e da altura no construtor, enquanto a segunda deve receber apenas o tamanho do lado;
- Uma classe para representar um círculo. Seu construtor deve receber o tamanho do raio.
No programa principal, pergunte ao usuário quantas formas ele deseja criar. Em seguida, para cada forma, pergunte se deseja criar um quadrado, um retângulo ou um círculo, solicitando os dados necessários para criar a forma. Finalmente, imprima: (a) os dados (lados ou raio); (b) os perímetros; e © as áreas de todas as formas.
Crie uma classe Produto com atributos de nome e preço. Escreva um programa que permita adicionar produtos a uma ArrayList, pesquisar um produto pelo nome e excluir um produto pelo nome.
Escreva um programa para preencher valores de um vetor de inteiros com 10 posições. O usuário irá informar os valores a serem inseridos e suas respectivas posições no array. O programa deve tratar as exceções ArrayIndexOutOfBoundsException quando for informada uma posição inexistente do vetor e NumberFormatException quando o valor informado não for número.