Pular para conteúdo

Projeto 03: Encapsulamento, Herança e Polimorfismo em OO 🏛️

Escopo do Projeto

Objetivo: Construir um domínio de objetos expressivo aplicando os pilares fundamentais da Orientação a Objetos: abstração, encapsulamento rígido, herança e substituição polimórfica.


🎯 1. Contexto & Desafio Prático

Você foi encarregado de projetar o núcleo de um simulador bancário corporativo. O sistema deve manipular contas correntes, contas poupança e contas de investimento com regras tributárias distintas, consumidas por um orquestrador via contratos polimórficos.


📋 2. Requisitos Técnicos Obrigatórios

  • R1 (Encapsulamento Rígido): Proteger atributos internos (saldo, titular, extrato) através de getters/setters ou properties validadas.
  • R2 (Classe Abstrata Base): Definir ContaBancaria com método abstrato aplicar_juros_mensais() e método concreto transferir().
  • R3 (Herança e Especialização): Especializar em ContaCorrente (com taxa de manutenção) e ContaInvestimento (com rendimento atrelado a indexador).
  • R4 (Polimorfismo em Lote): Iterar sobre uma coleção mista de contas e executar as rotinas mensais tratando todas via interface comum.

📐 3. Diagrama Conceitual & Arquitetura

classDiagram
    class ContaBancaria {
        <<abstract>>
        -saldo: float
        -titular: str
        +depositar(valor: float)
        +sacar(valor: float)
        +aplicar_juros()* void
    }
    class ContaCorrente {
        -taxaManutencao: float
        +aplicar_juros() void
    }
    class ContaInvestimento {
        -aliquotaRendimento: float
        +aplicar_juros() void
    }
    ContaBancaria <|-- ContaCorrente
    ContaBancaria <|-- ContaInvestimento

💻 4. Especificação Técnica & Código de Referência

// sistema_bancario_poo.py
from abc import ABC, abstractmethod

class ContaBancaria(ABC):
    def __init__(self, titular: str, saldo_inicial: float = 0.0):
        self._titular = titular
        self._saldo = saldo_inicial

    @property
    def saldo(self) -> float:
        return self._saldo

    @abstractmethod
    def aplicar_fechamento_mensal(self) -> None:
        pass

class ContaCorrente(ContaBancaria):
    def aplicar_fechamento_mensal(self) -> None:
        self._saldo -= 15.00 # Taxa de manutenção

class ContaInvestimento(ContaBancaria):
    def aplicar_fechamento_mensal(self) -> None:
        self._saldo += self._saldo * 0.012 # Rendimento 1.2%

📦 5. Critérios de Avaliação e Entrega

  1. Estrutura com classe abstrata (ABC) e métodos polimórficos.
  2. Encapsulamento com atributos privados protegidos contra mutação externa direta.
  3. Demonstração em código do fechamento mensal de uma carteira de contas.