Médio TypeScript
Conta bancária com protected e readonly
Enunciado
Implemente uma classe Conta com:
titular(public readonly)saldo(protected)- Construtor que inicializa ambos.
- Método
depositar(valor: number): voidque soma ao saldo. - Método
sacar(valor: number): voidque subtrai do saldo, mas lança erro se o valor for maior que o saldo. - Método
getSaldo(): numberque retorna o saldo (pode ser protected ou public? Use public para permitir consulta externa).
Depois, crie uma subclasse ContaPoupanca que estende Conta e adiciona um método renderJuros(taxa: number): void que aumenta o saldo em saldo * taxa. Use protected para acessar saldo diretamente na subclasse.
Requisitos
titulardeve serpublic readonly.saldodeve serprotected.sacardeve lançar erro se o valor for maior que o saldo.ContaPoupancadeve acessarsaldodiretamente (sem getter) para calcular juros.
Código inicial
// Implemente a classe Conta e ContaPoupanca
Saída esperada
Saldo: 1000
Saldo após saque: 700
Saldo após juros: 707
Ver dica
Na subclasse, você pode usar this.saldo porque é protected. Lembre-se de chamar super() no construtor da subclasse.
Mostrar solução
class Conta {
constructor(
public readonly titular: string,
protected saldo: number
) {}
public depositar(valor: number): void {
this.saldo += valor;
}
public sacar(valor: number): void {
if (valor > this.saldo) {
throw new Error("Saldo insuficiente");
}
this.saldo -= valor;
}
public getSaldo(): number {
return this.saldo;
}
}
class ContaPoupanca extends Conta {
constructor(titular: string, saldoInicial: number) {
super(titular, saldoInicial);
}
public renderJuros(taxa: number): void {
// Acessa saldo diretamente porque é protected
this.saldo += this.saldo * taxa;
}
}
// Teste
const conta = new ContaPoupanca("Ana", 1000);
console.log(`Saldo: ${conta.getSaldo()}`);
conta.sacar(300);
console.log(`Saldo após saque: ${conta.getSaldo()}`);
conta.renderJuros(0.01);
console.log(`Saldo após juros: ${conta.getSaldo().toFixed(0)}`);
Passo a passo
- A classe
Contausa parameter properties:public readonly titulareprotected saldo. depositarsoma o valor ao saldo (acessível dentro da classe).sacarverifica se o valor é maior que o saldo e lança erro se for; caso contrário, subtrai.getSaldoretorna o saldo atual (público para consulta externa).ContaPoupancaestendeContae chamasuper(titular, saldoInicial)para inicializar a base.renderJurosacessathis.saldodiretamente, pois éprotected— permitido em subclasses.- Testamos criando uma
ContaPoupanca, sacando e aplicando juros.
Por que funciona
O modificador protected permite que a subclasse ContaPoupanca acesse saldo sem precisar de um getter público. Isso mantém o encapsulamento: fora da hierarquia, saldo não é acessível. O readonly em titular impede alterações após a criação.
Erros comuns
- Tentar acessar
conta.saldofora da classe:console.log(conta.saldo)— erro de compilação porque éprotected. - Esquecer de chamar
super()no construtor da subclasse — erro de compilação. - Em
sacar, não verificar o saldo e permitir saldo negativo — o enunciado pede erro.
Outra forma de resolver
Usar um getter público para saldo e mantê-lo private, mas aí a subclasse não poderia acessá-lo diretamente; teria que usar o getter. protected é mais direto para herança.
Saída esperada
Saldo: 1000
Saldo após saque: 700
Saldo após juros: 707