Menu
Coddy logo textTech

Chamando Métodos da Classe Pai

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

Às vezes, substituir completamente um método não é o que você quer. Em vez disso, talvez você queira estender o comportamento do pai: fazer o que o pai faz e, depois, adicionar algo extra. Para conseguir isso, você pode chamar diretamente o método do pai dentro da substituição da classe filha.

A técnica usa a sintaxe de ponto com o nome da classe pai, passando explicitamente self como o primeiro argumento:

local Animal = {}
Animal.__index = Animal

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

function Animal:speak()
    print(self.name .. " makes a sound")
end

-- Dog estende o comportamento do pai
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

function Dog:speak()
    Animal.speak(self)  -- Chama o método do pai primeiro
    print(self.name .. " wags tail happily")
end

A linha principal é Animal.speak(self). Usando a sintaxe de ponto na classe pai e passando self manualmente, invocamos o método original antes de adicionar nosso próprio comportamento:

local buddy = Dog:new("Buddy")
buddy:speak()
-- Saída:
-- Buddy faz um som
-- Buddy abana o rabo felizmente

Este padrão é útil quando o método pai realiza um trabalho importante que você não quer duplicar. O filho pode executar a lógica do pai primeiro, por último ou até mesmo no meio do próprio código, dando a você controle total sobre como os comportamentos se combinam.

challenge icon

Desafio

Fácil

Vamos criar um sistema de saudações em que FormalPerson estende o comportamento de uma Person comum! Em vez de substituir completamente a forma como uma pessoa se apresenta, a versão formal fará primeiro a apresentação padrão e, em seguida, adicionará um toque extra de polidez.

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

  • Person.lua: Sua classe base com um construtor :new(name) que armazena o nome da pessoa. Inclua um método :introduce() que exibe o nome da pessoa seguido de says hi. Esse é o comportamento base que será estendido.
  • FormalPerson.lua: Uma classe filha que herda de Person. Seu construtor deve chamar o construtor da classe pai para lidar com o nome. Substitua o método :introduce(), mas, em vez de substituir completamente o comportamento da classe pai, chame primeiro o método da classe pai usando Person.introduce(self) e, em seguida, exiba uma linha adicional com o nome da pessoa seguido de bows politely.
  • main.lua: Importe seu módulo FormalPerson, leia um nome da entrada, crie uma instância de FormalPerson e chame :introduce() para ver os dois comportamentos combinados.

Você receberá uma entrada: o nome da pessoa.

Quando você chamar :introduce() em uma FormalPerson, ela deverá produzir duas linhas de saída: a primeira do método da classe pai e a segunda da adição da classe filha:

{name} says hi
{name} bows politely

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

Eleanor says hi
Eleanor bows politely

A principal ideia aqui é que FormalPerson não duplica a lógica de "says hi". Ela delega esse trabalho ao método da classe pai e, em seguida, adiciona seu próprio comportamento exclusivo. Isso mantém seu código limpo e demonstra como as classes filhas podem estender, em vez de substituir, a funcionalidade da classe pai!

Experimente você mesmo

-- main.lua: Ponto de entrada para o sistema de saudação

local FormalPerson = require('FormalPerson')

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

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

-- TODO: Chame o método introduce na instância de FormalPerson
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