Skip to content

gaokao [Polymofirms Code] #7208

@alvsdaniel

Description

@alvsdaniel

Arquivo 1: Reserva.java

(A classe Pai Abstrata)

code
Java
download
content_copy
expand_less
public abstract class Reserva {
protected String hospede;
protected int dias;
protected double valorDiaria;

public Reserva(String hospede, int dias, double valorDiaria) {
    this.hospede = hospede;
    this.dias = dias;
    this.valorDiaria = valorDiaria;
}

public abstract double calcularTotal();
public abstract String getTipo();

// Método que gera o texto e já mostra na tela (conforme seu estilo anterior)
public abstract String gerarFatura(); 

}
Arquivo 2: ReservaSimples.java

(Filha 1 - Cálculo normal)

code
Java
download
content_copy
expand_less
import javax.swing.JOptionPane;

public class ReservaSimples extends Reserva {

public ReservaSimples(String hospede, int dias, double valorDiaria) {
    super(hospede, dias, valorDiaria);
}

@Override
public double calcularTotal() {
    return dias * valorDiaria;
}

@Override
public String getTipo() {
    return "Simples";
}

@Override
public String gerarFatura() {
    double total = calcularTotal();
    String fatura = "Tipo: " + getTipo() + 
                    "\nHóspede: " + hospede + 
                    "\nDias: " + dias + 
                    "\nValor Diária: " + valorDiaria + 
                    "\nTOTAL A PAGAR: R$ " + total;
    
    // Mostra o popup
    JOptionPane.showMessageDialog(null, fatura);
    return fatura;
}

}
Arquivo 3: ReservaExecutiva.java

(Filha 2 - Taxa de 15%)

code
Java
download
content_copy
expand_less
import javax.swing.JOptionPane;

public class ReservaExecutiva extends Reserva {

public ReservaExecutiva(String hospede, int dias, double valorDiaria) {
    super(hospede, dias, valorDiaria);
}

@Override
public double calcularTotal() {
    // Acréscimo de 15%
    return (dias * valorDiaria) * 1.15;
}

@Override
public String getTipo() {
    return "Executiva";
}

@Override
public String gerarFatura() {
    double total = calcularTotal();
    String fatura = "Tipo: " + getTipo() + 
                    "\nHóspede: " + hospede + 
                    "\nDias: " + dias + 
                    "\nValor Diária: " + valorDiaria + 
                    "\nTOTAL A PAGAR: R$ " + total;

    JOptionPane.showMessageDialog(null, fatura);
    return fatura;
}

}
Arquivo 4: ReservaPremium.java

(Filha 3 - Taxa fixa de R$ 120)

code
Java
download
content_copy
expand_less
import javax.swing.JOptionPane;

public class ReservaPremium extends Reserva {

public ReservaPremium(String hospede, int dias, double valorDiaria) {
    super(hospede, dias, valorDiaria);
}

@Override
public double calcularTotal() {
    // Valor normal + Taxa fixa de 120
    return (dias * valorDiaria) + 120;
}

@Override
public String getTipo() {
    return "Premium";
}

@Override
public String gerarFatura() {
    double total = calcularTotal();
    String fatura = "Tipo: " + getTipo() + 
                    "\nHóspede: " + hospede + 
                    "\nDias: " + dias + 
                    "\nValor Diária: " + valorDiaria + 
                    "\nTOTAL A PAGAR: R$ " + total;

    JOptionPane.showMessageDialog(null, fatura);
    return fatura;
}

}
Arquivo 5: ProcessadorReservas.java

(Motor de Faturamento - Polimorfismo)

code
Java
download
content_copy
expand_less
public class ProcessadorReservas {

// Recebe a classe genérica 'Reserva'
public double processar(Reserva r) {
    // Chama o método polimórfico (cada filha responde do seu jeito)
    r.gerarFatura();
    
    // Retorna o valor para somar no relatório
    return r.calcularTotal();
}

}
Arquivo 6: Sistema.java

(O menu principal com ArrayList)

code
Java
download
content_copy
expand_less
import javax.swing.JOptionPane;
import java.util.ArrayList;

public class Sistema {
public static void main(String[] args) {

    // Lista para guardar todas as reservas
    ArrayList<Reserva> listaReservas = new ArrayList<>();
    
    // Instancia o processador
    ProcessadorReservas processador = new ProcessadorReservas();
    
    boolean executando = true;

    while (executando) {
        String menu = "HOTEL SYSTEM - MENU:\n" +
                      "1 - Nova Reserva\n" +
                      "2 - Listar Reservas\n" +
                      "3 - Processar Faturamento\n" +
                      "4 - Relatório Financeiro\n" +
                      "5 - Sair";
        
        String opcao = JOptionPane.showInputDialog(menu);
        
        // Tratamento para botão cancelar ou opção 5
        if (opcao == null || opcao.equals("5")) {
            executando = false;
            break;
        }

        // --- 1. CADASTRAR NOVA RESERVA ---
        if (opcao.equals("1")) {
            String tipo = JOptionPane.showInputDialog("Tipo (1-Simples, 2-Executiva, 3-Premium):");
            String nome = JOptionPane.showInputDialog("Nome do Hóspede:");
            
            int dias = Integer.parseInt(JOptionPane.showInputDialog("Número de Dias:"));
            double valor = Double.parseDouble(JOptionPane.showInputDialog("Valor da Diária:"));

            // Criação do objeto correto (Polimorfismo)
            if (tipo.equals("1")) {
                listaReservas.add(new ReservaSimples(nome, dias, valor));
            } else if (tipo.equals("2")) {
                listaReservas.add(new ReservaExecutiva(nome, dias, valor));
            } else if (tipo.equals("3")) {
                listaReservas.add(new ReservaPremium(nome, dias, valor));
            } else {
                JOptionPane.showMessageDialog(null, "Tipo inválido!");
            }
        }

        // --- 2. LISTAR RESERVAS ---
        else if (opcao.equals("2")) {
            String textoLista = "--- RESERVAS CADASTRADAS ---\n";
            for (Reserva r : listaReservas) {
                textoLista += r.getTipo() + ": " + r.hospede + "\n";
            }
            JOptionPane.showMessageDialog(null, textoLista);
        }

        // --- 3. PROCESSAR (MOSTRAR FATURAS) ---
        else if (opcao.equals("3")) {
            for (Reserva r : listaReservas) {
                // O processador chama o gerarFatura() de cada um
                processador.processar(r);
            }
        }

        // --- 4. RELATÓRIO FINANCEIRO ---
        else if (opcao.equals("4")) {
            double totalBruto = 0;
            double totalLiquido = 0;
            
            for (Reserva r : listaReservas) {
                // Acumula o valor total (com taxas)
                totalBruto += r.calcularTotal();
                
                // Calcula o valor base (sem taxas) apenas para estatística
                // Como os atributos são protected, podemos acessar direto na mesma package
                // Ou usar getters se preferir
                totalLiquido += (r.dias * r.valorDiaria);
            }
            
            double totalTaxas = totalBruto - totalLiquido;

            String relatorio = "RELATÓRIO FINANCEIRO:\n" +
                               "Total Faturado (Bruto): R$ " + totalBruto + "\n" +
                               "Total Líquido (Base): R$ " + totalLiquido + "\n" +
                               "Total em Taxas: R$ " + totalTaxas;
            
            JOptionPane.showMessageDialog(null, relatorio);
        }
    }
}

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    awaiting triageAwaiting triage from a maintainer

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions