Métodos e Atributos Herdados

Métodos e Atributos Herdados

A herança é um dos pilares fundamentais da Programação Orientada a Objetos (POO). Permite que uma classe (subclasse) herde atributos e métodos de outra classe (superclasse). Esta funcionalidade promove a reutilização de código e a hierarquia de classes, tornando a programação mais eficiente e organizada.

Conceitos Básicos de Herança

Em Python, a herança é implementada através da definição de uma nova classe que recebe como parâmetro a classe que deseja herdar. Vamos examinar um exemplo simples para compreender melhor este conceito:

class Animal:
    def __init__(self, nome):
        self.nome = nome
    
    def fazer_som(self):
        pass


class Cao(Animal):
    def fazer_som(self):
        return "Ladrar"
    

class Gato(Animal):
    def fazer_som(self):
        return "Miar"


# Criação de objetos
cao = Cao("Rex")
gato = Gato("Mimi")

print(cao.nome)  # Output: Rex
print(cao.fazer_som())  # Output: Ladrar
print(gato.nome)  # Output: Mimi
print(gato.fazer_som())  # Output: Miar

Neste exemplo, Cao e Gato são subclasses que herdam a classe Animal. Ambas possuem o método fazer_som, que é sobrescrito em cada subclasse para retornar o som que cada animal faz.

Atributos Herdados

Os atributos definidos na superclasse são automaticamente herdados pelas subclasses. Isto significa que, ao criar instâncias das subclasses, os atributos da superclasse estarão disponíveis.

Exemplo

Considere uma classe Veiculo com um atributo marca:

class Veiculo:
    def __init__(self, marca):
        self.marca = marca


class Carro(Veiculo):
    def __init__(self, marca, modelo):
        super().__init__(marca)
        self.modelo = modelo

        
class Moto(Veiculo):
    def __init__(self, marca, cilindrada):
        super().__init__(marca)
        self.cilindrada = cilindrada


# Criação de objetos
carro = Carro("Toyota", "Corolla")
moto = Moto("Honda", "150cc")

print(carro.marca)  # Output: Toyota
print(carro.modelo)  # Output: Corolla
print(moto.marca)  # Output: Honda
print(moto.cilindrada)  # Output: 150cc

Neste exemplo, Carro e Moto herdam o atributo marca da classe Veiculo e definem os seus próprios atributos modelo e cilindrada, respetivamente.

Métodos Herdados

Os métodos definidos na superclasse também são herdados pelas subclasses, podendo ser utilizados diretamente ou sobrescritos para fornecer uma implementação específica.

Exemplo

Vamos adicionar um método descricao à classe Veiculo e ver como ele pode ser utilizado pelas subclasses:

class Veiculo:
    def __init__(self, marca):
        self.marca = marca

    def descricao(self):
        return f"Veículo da marca {self.marca}"


class Carro(Veiculo):
    def __init__(self, marca, modelo):
        super().__init__(marca)
        self.modelo = modelo

    def descricao(self):
        return f"Carro {self.modelo} da marca {self.marca}"
        

class Moto(Veiculo):
    def __init__(self, marca, cilindrada):
        super().__init__(marca)
        self.cilindrada = cilindrada

    def descricao(self):
        return f"Moto {self.cilindrada} da marca {self.marca}"


# Criação de objetos e chamada aos métodos
carro = Carro("Toyota", "Corolla")
moto = Moto("Honda", "150cc")

print(carro.descricao())  # Output: Carro Corolla da marca Toyota
print(moto.descricao())  # Output: Moto 150cc da marca Honda

Aqui, o método descricao na superclasse Veiculo é sobrescrito nas subclasses Carro e Moto para fornecer uma descrição mais específica.

Resumo

Neste capítulo, aprendemos sobre a herança em Python, como os atributos e métodos são herdados, e como podemos sobrescrever métodos para fornecer implementações específicas nas subclasses. Esta capacidade de reutilizar código torna os nossos programas mais eficientes e organizados.

Quiz

  1. O que permite a herança na Programação Orientada a Objetos?

    • a) Atribuição de novos atributos às classes
    • b) Criação de hierarquias de classes e reutilização de código
    • c) Encapsulamento de dados
  2. Qual das seguintes opções é verdadeira sobre atributos herdados?

    • a) Apenas as subclasses podem ter atributos
    • b) Os atributos da superclasse são automaticamente disponíveis nas subclasses
    • c) Os atributos da superclasse precisam ser redefinidos nas subclasses
  3. O que acontece quando um método definido na superclasse é sobrescrito numa subclasse?

    • a) O método da superclasse é excluído
    • b) A subclasse pode fornecer uma implementação específica para o método
    • c) O método não pode ser usado

Respostas:

  1. b) Criação de hierarquias de classes e reutilização de código
  2. b) Os atributos da superclasse são automaticamente disponíveis nas subclasses
  3. b) A subclasse pode fornecer uma implementação específica para o método
<< Herança Simples vs. Heran... Índice Sobrescrita de Métodos >>