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): void que soma ao saldo.
  • Método sacar(valor: number): void que subtrai do saldo, mas lança erro se o valor for maior que o saldo.
  • Método getSaldo(): number que 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

  • titular deve ser public readonly.
  • saldo deve ser protected.
  • sacar deve lançar erro se o valor for maior que o saldo.
  • ContaPoupanca deve acessar saldo diretamente (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

  1. A classe Conta usa parameter properties: public readonly titular e protected saldo.
  2. depositar soma o valor ao saldo (acessível dentro da classe).
  3. sacar verifica se o valor é maior que o saldo e lança erro se for; caso contrário, subtrai.
  4. getSaldo retorna o saldo atual (público para consulta externa).
  5. ContaPoupanca estende Conta e chama super(titular, saldoInicial) para inicializar a base.
  6. renderJuros acessa this.saldo diretamente, pois é protected — permitido em subclasses.
  7. 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.saldo fora 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