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!")
endAgora 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.
Desafio
FácilVamos 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 desays 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 depurrs 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 contentedlyA 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
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
1O Conceito 'Self'
Tabelas com Funções'self' ExplícitoA Sintaxe de Dois-pontosPonto vs Dois-pontosRecapitulação - Movendo o Ponto4Projeto: Banco Digital
Configuração do ProjetoMétodo de Depósito7Polimorfismo e Sobrescrita
Sobrescrita de MétodosChamando Métodos da Classe PaiDuck TypingInterface ComumVerificando o TipoRecapitulação - Papéis de Funcionários10Projeto: Gerenciador de Formas
Configuração do ProjetoClasse RetânguloClasse CírculoMétodo PerímetroColeção de FormasÁrea TotalFiltrar Formas2Padrão de Protótipo de Classe
O Conceito de ProtótipoVinculando com __indexO Construtor :new()Inicializando AtributosInstâncias IndependentesRecapitulação - Fábrica de Carros5Sobrecarga de Operadores em POO
Somando ObjetosSubtraindo ObjetosConcatenando ObjetosComparando Objetos (<, >)Recapitulação - Matemática de Carteira8Encapsulamento
Convenções de NomenclaturaClosures para PrivacidadeAcesso via ClosuresTabelas Somente LeituraLógica de ValidaçãoRecapitulação - Cofre Seguro11Padrões de Projeto (Lite)
Funções FactoryTabela SingletonPadrão IteratorObserver (Listener)Recapitulação - Logger Factory3Estado e Comportamento do Objeto
Variáveis de InstânciaMétodos GetterMétodos SetterPropriedades CalculadasFormatação de StringsVerificações de IgualdadeRecapitulação - Nota do Aluno6Fundamentos de Herança
Configurando a HerançaHerdando MétodosEstendendo o ConstrutorAdicionando Métodos FilhosCompartilhado vs ÚnicoRecapitulação - Hierarquia de FormasPratique por conta própria: Compilador de Lua online