Sistema bancário completo
Em sistemas financeiros reais, diferentes tipos de contas (corrente, poupança) têm regras distintas: cheque especial, rendimento, bloqueios. Usar herança com classes permite reutilizar código da conta base e especializar o comportamento sem duplicar lógica. Dominar encapsulamento com campos privados (#) evita que dados críticos como saldo sejam alterados diretamente, prevenindo bugs que poderiam causar prejuízos.
O PROBLEMA
Implemente ContaBancaria, ContaCorrente (cheque especial), ContaPoupanca (rendimento). Banco gerencia contas.
EXEMPLO
const cc = new ContaCorrente('Ana', 1000, 500);
cc.sacar(1200) → usa cheque especial
cc.saldo → -200
cc.limite → 500SOBRE O CONCEITO
O exercício usa class, extends e super para criar uma hierarquia: ContaBancaria é a classe base com #saldo privado, #titular etc. ContaCorrente estende e adiciona #limite (cheque especial). O erro comum de deixar saldo público permite que conta.saldo = 9999 burle as regras de negócio. Outro erro é não tratar o cheque especial no método sacar: em ContaCorrente, deve-se permitir saque até #saldo + #limite, atualizando o saldo para negativo. Já em ContaPoupanca, não há cheque especial; o saque só é permitido se #saldo >= valor. Usar throw para lançar exceções quando a operação é inválida garante que o sistema não aceite movimentações indevidas. O método depositar e aplicarRendimento devem ser implementados respeitando as regras de cada tipo de conta.
RESOLUÇÃO