Menu
Coddy logo textTech

Adicionando Métodos Filhos

Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 34 de 70.

A herança permite que classes filhas acessem os métodos da classe pai, mas o verdadeiro poder vem de adicionar novos métodos que apenas a classe filha possui. Um Dog pode fazer tudo o que um Animal pode fazer, além de coisas exclusivas dos cães, como latir.

Adicionar um método específico da classe filha é simples: basta defini-lo na tabela da classe filha. Como as instâncias procuram primeiro os métodos em sua própria classe, elas encontrarão o novo método sem afetar a classe pai.

local Animal = {}
Animal.__index = Animal

function Animal:new(name)
    local obj = {name = name}
    setmetatable(obj, Animal)
    return obj
end

function Animal:breathe()
    print(self.name .. " is breathing")
end

-- Dog herda de Animal
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

function Dog:new(name)
    local obj = Animal.new(Animal, name)
    setmetatable(obj, Dog)
    return obj
end

-- Novo método apenas em Dog
function Dog:bark()
    print(self.name .. " says: Woof!")
end

Agora as instâncias de Dog podem usar métodos herdados e exclusivos:

local buddy = Dog:new("Buddy")
buddy:breathe()  -- Saída: Buddy está respirando (herdado)
buddy:bark()     -- Saída: Buddy diz: Woof! (somente da filha)

A classe pai permanece inalterada: chamar :bark() em um Animal comum falharia, pois esse método não existe nele. É assim que a herança permite especializar o comportamento enquanto mantém a funcionalidade compartilhada em um único lugar.

challenge icon

Desafio

Fácil

Vamos criar uma hierarquia de animais de estimação em que os gatos têm sua própria habilidade especial! Você criará uma classe pai Pet e uma classe filha Cat, em que Cat herda tudo de Pet, mas também tem um método exclusivo que somente gatos podem executar.

Você organizará seu código em três arquivos:

  • Pet.lua: Defina sua classe pai com um construtor :new(name) que armazena o nome do animal. Inclua um método :greet() que exibe o nome do animal seguido de says hello. Configure o padrão de classe convencional e retorne a classe.
  • Cat.lua: Defina sua classe filha, que herda de Pet. O construtor :new(name) de Cat deve chamar o construtor pai para inicializar o nome e, em seguida, vincular novamente a metatabela a Cat. Adicione um método específico da classe filha, :purr(), que exibe o nome do gato seguido de purrs contentedly. Esse método existe somente em Cat: Pet não o possui!
  • main.lua: Importe seu módulo Cat, leia um nome da entrada, crie uma instância de Cat e demonstre que ela pode usar tanto o método herdado :greet() quanto seu próprio método exclusivo :purr().

Você receberá uma entrada: o nome do gato.

No seu arquivo principal, crie um Cat com o nome fornecido e, em seguida, chame :greet() seguido de :purr() em linhas separadas.

Por exemplo, se a entrada for Whiskers, a saída deverá ser:

Whiskers says hello
Whiskers purrs contentedly

A primeira linha vem do método herdado :greet() definido em Pet, enquanto a segunda linha vem do método :purr(), que existe somente em Cat. Isso demonstra como as classes filhas podem fazer tudo o que a classe pai pode fazer, além de terem seus próprios comportamentos especializados!

Experimente você mesmo

-- main.lua: Cria um Cat e demonstra herança

local Cat = require('Cat')

-- Lê o nome do gato a partir da entrada
local name = io.read()

-- TODO: Cria uma instância de Cat com o nome fornecido

-- TODO: Chama o método herdado :greet() (de Pet)

-- TODO: Chama o método :purr() específico de Cat
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Lua online