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:
- O que é a sobrescrita de métodos?
- Por que a sobrescrita de métodos é importante na POO?
- Como podes chamar o método da superclasse a partir da subclasse?
- 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()
- No exemplo do sistema de funcionários, o que acontece se o método
mostrar_informacao
da classeGerente
não utilizarsuper()
?
Responde a estas perguntas para assegurar que compreendeste os conceitos discutidos neste capítulo.