Sobrescrita de Métodos

A sobrescrita de métodos (ou overriding) é um conceito fundamental na Programação Orientada a Objetos que permite a uma subclasse fornecer uma implementação específica de um método que já foi definido na sua superclasse ou classe pai. Isto é particularmente útil quando se trabalha com herança, pois possibilita que a subclasse adapte ou estenda o comportamento do método herdado.

Por Que Usar a Sobrescrita de Métodos?

A sobrescrita de métodos é importante para:

  • Especializar o Comportamento: Permite que a subclasse tenha um comportamento diferente do método existente na superclasse.
  • Polimorfismo: É uma das bases do polimorfismo, permitindo que o mesmo método execute tarefas diferentes dependendo do objeto que o invoca.

Como Funciona a Sobrescrita de Métodos em Python

Em Python, a sobrescrita de métodos é bastante simples de implementar. Basta definir um método na subclasse com o mesmo nome e a mesma assinatura que o método na superclasse.

Vamos ver um exemplo prático:

class Veiculo:
    def mover(self):
        print("O veículo está a mover-se")

class Carro(Veiculo):
    def mover(self):
        print("O carro está a mover-se rapidamente")

# Criação de instâncias
veiculo1 = Veiculo()
veiculo1.mover()  # Output: O veículo está a mover-se

carro1 = Carro()
carro1.mover()  # Output: O carro está a mover-se rapidamente

No exemplo acima, a classe Carro sobrescreve o método mover da classe Veiculo. Isto permite que Carro forneça uma implementação mais específica do método mover.

Usando a Sobrescrita de Métodos em Conjunto com super()

Se quiseres chamar o método da superclasse na subclasse, podes utilizar a função super(). Esta função facilita o acesso ao método da classe pai, permitindo que o método da subclasse possa complementar o comportamento herdado.

class Veiculo:
    def mover(self):
        print("O veículo está a mover-se")

class Carro(Veiculo):
    def mover(self):
        super().mover()
        print("O carro está a mover-se rapidamente")

# Criação de instâncias
carro1 = Carro()
carro1.mover()  
# Output:
# O veículo está a mover-se
# O carro está a mover-se rapidamente

No exemplo acima, o método mover da classe Carro chama o método mover da classe Veiculo utilizando super(), e depois executa a sua própria implementação.

Exemplo do Mundo Real: Sistema de Funcionários

Vamos considerar um exemplo mais complexo que demonstra a utilidade da sobrescrita de métodos num sistema de gestão de funcionários.

class Funcionario:
    def __init__(self, nome, salario):
        self.nome = nome
        self.salario = salario
    
    def mostrar_informacao(self):
        print(f"Nome: {self.nome}, Salário: {self.salario}")

class Gerente(Funcionario):
    def __init__(self, nome, salario, bonus):
        super().__init__(nome, salario)
        self.bonus = bonus
    
    def mostrar_informacao(self):
        super().mostrar_informacao()
        print(f"Bónus: {self.bonus}")

# Criação de instâncias
funcionario1 = Funcionario("Ana", 3000)
gerente1 = Gerente("Carlos", 5000, 1500)

funcionario1.mostrar_informacao()
# Output:
# Nome: Ana, Salário: 3000

gerente1.mostrar_informacao()
# Output:
# Nome: Carlos, Salário: 5000
# Bónus: 1500

Neste exemplo, a classe Gerente herda da classe Funcionario e sobrescreve o método mostrar_informacao para adicionar detalhes adicionais (o bónus).

Resumo

A sobrescrita de métodos é uma técnica poderosa na POO, que permite que as subclasses personalizem ou expandam o comportamento das suas superclasses. Com a capacidade de usar super(), também podes combinar a lógica da superclasse com a da subclasse, criando um fluxo mais robusto e flexível no teu programa.

Questionário

Vamos testar o teu conhecimento com algumas perguntas:

  1. O que é a sobrescrita de métodos?
  2. Por que a sobrescrita de métodos é importante na POO?
  3. Como podes chamar o método da superclasse a partir da subclasse?
  4. Qual é a saída do seguinte código?
    class Animal:
        def fazer_som(self):
            print("O animal faz um som")
    
    class Cao(Animal):
        def fazer_som(self):
            print("O cao late")
    
    cao1 = Cao()
    cao1.fazer_som()
    
  5. No exemplo do sistema de funcionários, o que acontece se o método mostrar_informacao da classe Gerente não utilizar super()?

Responde a estas perguntas para assegurar que compreendeste os conceitos discutidos neste capítulo.

<< Métodos e Atributos Herda... Índice Projeto Prático: Hierarqu... >>