Menu
Coddy logo textTech

Herdando Métodos

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

Com o vínculo de herança estabelecido, as instâncias da classe filha obtêm automaticamente acesso a todos os métodos da classe pai. Isso acontece por meio da cadeia de busca do Lua: quando você chama um método em uma instância, o Lua pesquisa cada tabela conectada até encontrar o que você está procurando.

Considere esta configuração em que Animal define um método :breathe():

local Animal = {}
Animal.__index = Animal

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

function Animal:breathe()
    print("Breathing...")
end

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

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

Agora observe o que acontece quando criamos um Dog e chamamos o método da classe pai:

local buddy = Dog:new()
buddy:breathe()  -- Saída: Respirando...

A classe Dog nunca definiu :breathe(), mas isso funciona. Primeiro, o Lua verifica buddy, não encontra nada; depois verifica Dog, ainda sem encontrar nada; e, por fim, encontra o método em Animal. Essa herança automática de métodos significa que você escreve o comportamento compartilhado uma única vez na classe-pai, e toda classe-filha se beneficia imediatamente.

challenge icon

Desafio

Fácil

Vamos criar uma hierarquia simples de criaturas para ver a herança de métodos em ação! Você criará uma classe pai Animal e uma classe filha Dog e, em seguida, demonstrará que as instâncias de Dog podem usar métodos definidos apenas em Animal.

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

  • Animal.lua: Defina sua classe pai usando o padrão de classe convencional. Inclua um construtor :new(name) que armazene o nome do animal e um método :speak() que imprima o nome do animal seguido de makes a sound. Retorne a classe ao final do arquivo.
  • Dog.lua: Defina sua classe filha, que herda de Animal. Requeira o módulo Animal e configure o vínculo de herança para que Dog possa acessar os métodos de Animal. Inclua um construtor :new(name) que armazene o nome e defina Dog como a metatabela. A classe Dog NÃO deve definir seu próprio método :speak(). Ela herdará esse método de Animal.
  • main.lua: Requeira seu módulo Dog, leia um nome da entrada, crie uma instância de Dog com esse nome e chame o método :speak() nela.

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

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

Buddy makes a sound

A mágica aqui é que sua classe Dog nunca define :speak(), mas chamá-lo em uma instância de Dog funciona perfeitamente. Lua segue a cadeia de busca da instância Dog até a classe Dog e, depois, até a classe Animal, onde encontra o método. Isso é a herança em ação!

Experimente você mesmo

-- main.lua: Ponto de entrada

local Dog = require('Dog')

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

-- TODO: Crie uma instância de Dog com o nome fornecido

-- TODO: Chame o método :speak() na instância do dog
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