Aqui está a solução completa em Java atendendo a todos os requisitos solicitados na questão.
1. Exceção Personalizada
([Link])
public class PrecoInvalidoException extends Exception {
public PrecoInvalidoException(String mensagem) {
super(mensagem);
}
}
2. Interface ([Link])
public interface Garantia {
double calcularGarantiaEstendida(int meses);
}
3. Classe Abstrata Base ([Link])
public abstract class Produto {
private int codigo;
private String nome;
private double preco;
public Produto(int codigo, String nome, double preco) throws
PrecoInvalidoException {
if (preco <= 0) {
throw new PrecoInvalidoException("Erro: O preço do produto
deve ser maior que zero.");
}
[Link] = codigo;
[Link] = nome;
[Link] = preco;
}
// Método abstrato para calcular o preço final
public abstract double calcularPrecoFinal();
// Sobrecarga de métodos: sem desconto
public double calcularPrecoFinal(double percentualDesconto) throws
PrecoInvalidoException {
if (percentualDesconto > 50) {
throw new PrecoInvalidoException("Erro: O desconto não
pode ser maior que 50%.");
}
return [Link] * (1 - percentualDesconto / 100.0);
}
// Sobrecarga de métodos: com desconto e frete
public double calcularPrecoFinal(double percentualDesconto, double
valorFrete) throws PrecoInvalidoException {
return calcularPrecoFinal(percentualDesconto) + valorFrete;
}
// Getters e Setters
public int getCodigo() { return codigo; }
public void setCodigo(int codigo) { [Link] = codigo; }
public String getNome() { return nome; }
public void setNome(String nome) { [Link] = nome; }
public double getPreco() { return preco; }
public void setPreco(double preco) throws PrecoInvalidoException {
if (preco <= 0) {
throw new PrecoInvalidoException("Erro: O preço do produto
deve ser maior que zero.");
}
[Link] = preco;
}
@Override
public String toString() {
return "Código: " + codigo + " | Nome: " + nome + " | Preço
Base: R$ " + [Link]("%.2f", preco);
}
}
4. Classe Intermediária ([Link])
public abstract class ProdutoEletronico extends Produto {
private int voltagem; // Atributo específico para eletrônicos
public ProdutoEletronico(int codigo, String nome, double preco,
int voltagem) throws PrecoInvalidoException {
super(codigo, nome, preco); // Uso do super para inicializar
atributos herdados
[Link] = voltagem;
}
public int getVoltagem() { return voltagem; }
public void setVoltagem(int voltagem) { [Link] =
voltagem; }
}
5. Subclasses Concretas ([Link] e
[Link])
[Link]
public class Smartphone extends ProdutoEletronico implements Garantia
{
private int memoriaRam;
public Smartphone(int codigo, String nome, double preco, int
voltagem, int memoriaRam) throws PrecoInvalidoException {
super(codigo, nome, preco, voltagem);
[Link] = memoriaRam;
}
@Override
public double calcularPrecoFinal() {
// Exemplo de regra específica para o preço final padrão do
Smartphone (ex: taxa/imposto de 5%)
return getPreco() * 1.05;
}
@Override
public double calcularGarantiaEstendida(int meses) {
// Custa R$ 15 por mês de garantia estendida
return meses * 15.0;
}
@Override
public String toString() {
return "[Smartphone] " + [Link]() + " | Voltagem: " +
getVoltagem() + "V | RAM: " + memoriaRam + "GB";
}
}
[Link]
public class Notebook extends ProdutoEletronico implements Garantia {
private String processador;
public Notebook(int codigo, String nome, double preco, int
voltagem, String processador) throws PrecoInvalidoException {
super(codigo, nome, preco, voltagem);
[Link] = processador;
}
@Override
public double calcularPrecoFinal() {
// Exemplo de regra específica para o preço final padrão do
Notebook (ex: taxa/imposto de 8%)
return getPreco() * 1.08;
}
@Override
public double calcularGarantiaEstendida(int meses) {
// Custa R$ 30 por mês de garantia estendida
return meses * 30.0;
}
@Override
public String toString() {
return "[Notebook] " + [Link]() + " | Voltagem: " +
getVoltagem() + "V | Processador: " + processador;
}
}
6. Classe Principal com Menu ([Link])
import [Link];
import [Link];
public class Main {
private static ArrayList<Produto> listaProdutos = new
ArrayList<>();
private static Scanner scanner = new Scanner([Link]);
public static void main(String[] args) {
int opcao = -1;
while (opcao != 0) {
[Link]("\n--- SISTEMA DE COMÉRCIO ELETRÔNICO
---");
[Link]("1. Cadastrar Produto");
[Link]("2. Alterar Produto");
[Link]("3. Excluir Produto");
[Link]("4. Buscar / Listar Produtos");
[Link]("0. Sair");
[Link]("Escolha uma opção: ");
try {
opcao = [Link]([Link]());
switch (opcao) {
case 1 -> cadastrarProduto();
case 2 -> alterarProduto();
case 3 -> excluirProduto();
case 4 -> buscarProdutos();
case 0 -> [Link]("Saindo do
sistema...");
default -> [Link]("Opção inválida!");
}
} catch (NumberFormatException e) {
[Link]("Erro: Digite apenas números
válidos.");
} catch (PrecoInvalidoException e) {
// Captura e tratamento da exceção personalizada
propagada
[Link]("SISTEMA DE EXCEÇÃO: " +
[Link]());
}
}
}
private static void cadastrarProduto() throws
PrecoInvalidoException {
[Link]("\nTipo de produto: 1. Smartphone | 2.
Notebook");
int tipo = [Link]([Link]());
[Link]("Código: ");
int codigo = [Link]([Link]());
[Link]("Nome: ");
String nome = [Link]();
[Link]("Preço Base: ");
double preco = [Link]([Link]());
[Link]("Voltagem (110/220): ");
int voltagem = [Link]([Link]());
if (tipo == 1) {
[Link]("Memória RAM (GB): ");
int ram = [Link]([Link]());
[Link](new Smartphone(codigo, nome, preco,
voltagem, ram));
[Link]("Smartphone cadastrado com sucesso!");
} else if (tipo == 2) {
[Link]("Processador: ");
String proc = [Link]();
[Link](new Notebook(codigo, nome, preco,
voltagem, proc));
[Link]("Notebook cadastrado com sucesso!");
} else {
[Link]("Tipo inválido.");
}
}
private static void alterarProduto() throws PrecoInvalidoException
{
[Link]("Digite o código do produto que deseja
alterar: ");
int codigo = [Link]([Link]());
Produto p = buscarPorCodigo(codigo);
if (p == null) {
[Link]("Produto não encontrado.");
return;
}
[Link]("Novo Nome (" + [Link]() + "): ");
String novoNome = [Link]();
if (![Link]()) [Link](novoNome);
[Link]("Novo Preço Base (" + [Link]() + "): ");
String novoPrecoStr = [Link]();
if (![Link]()) {
double novoPreco = [Link](novoPrecoStr);
[Link](novoPreco);
}
[Link]("Produto atualizado com sucesso!");
}
private static void excluirProduto() {
[Link]("Digite o código do produto que deseja
excluir: ");
int codigo = [Link]([Link]());
Produto p = buscarPorCodigo(codigo);
if (p != null) {
[Link](p);
[Link]("Produto removido com sucesso!");
} else {
[Link]("Produto não encontrado.");
}
}
private static void buscarProdutos() throws PrecoInvalidoException
{
if ([Link]()) {
[Link]("Nenhum produto cadastrado.");
return;
}
[Link]("\n--- LISTA DE PRODUTOS E PREÇOS
CALCULADOS ---");
[Link]("Deseja aplicar um percentual de desconto
para a lista (0 para nenhum)? ");
double desconto = [Link]([Link]());
[Link]("Deseja incluir valor de frete (0 para
nenhum)? ");
double frete = [Link]([Link]());
for (Produto p : listaProdutos) {
[Link](p);
// Polimorfismo e chamada aos métodos sobrecarregados
double precoFinal;
if (desconto == 0 && frete == 0) {
precoFinal = [Link](); // Sobreescrito
por classe
} else if (frete == 0) {
precoFinal = [Link](desconto); //
Sobrecarga (com desconto)
} else {
precoFinal = [Link](desconto, frete); //
Sobrecarga (com desconto e frete)
}
[Link](" -> Preço Final Calculado: R$ %.2f\
n", precoFinal);
if (p instanceof Garantia) {
Garantia g = (Garantia) p;
[Link](" -> Garantia Estendida de 12
meses: R$ %.2f\n", [Link](12));
}
[Link]("--------------------------------------------------
");
}
}
private static Produto buscarPorCodigo(int codigo) {
for (Produto p : listaProdutos) {
if ([Link]() == codigo) return p;
}
return null;
}
}