Método Perímetro
Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 58 de 70.
Desafio
FácilVamos estender nosso Shape Manager adicionando um método :getPerimeter() às classes Rectangle e Circle. Assim como :getArea(), cada forma calcula seu perímetro de maneira diferente, mas elas compartilham o mesmo nome de método: um exemplo perfeito de polimorfismo em ação.
Você continuará trabalhando com seus arquivos existentes:
Shape.lua: sua classe base Shape permanece inalterada.Rectangle.lua: adicione um método:getPerimeter()que retorne o perímetro do retângulo usando a fórmula 2 × (width + height).Circle.lua: adicione um método:getPerimeter()que retorne a circunferência do círculo usando a fórmula 2 × π × radius. Usemath.pipara π.main.lua: importe ambos os módulos de formas, leia as dimensões da entrada, crie um Rectangle e um Circle e, em seguida, imprima seis linhas: o nome, a área e o perímetro do retângulo, seguidos pelo nome, a área e o perímetro do círculo.
Agora ambas as formas têm uma interface completa com :getName(), :getArea() e :getPerimeter(): todos acessíveis por meio dos mesmos nomes de método, apesar das implementações diferentes.
Entrada: Três linhas: width (número), height (número) e radius (número).
Saída: Seis linhas na ordem: nome do retângulo, área do retângulo, perímetro do retângulo, nome do círculo, área do círculo e perímetro do círculo.
Experimente você mesmo
-- Requer o módulo Rectangle
local Rectangle = require('Rectangle')
-- Requer o módulo Circle
local Circle = require('Circle')
-- Lê a largura e a altura da entrada
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())
-- Cria uma nova instância de Rectangle com as dimensões dadas
local rect = Rectangle:new(width, height)
-- Cria uma nova instância de Circle com o raio dado
local circ = Circle:new(radius)
-- Imprime o nome, a área e o perímetro do retângulo
print(rect:getName())
print(rect:getArea())
print(rect:getPerimeter())
-- Imprime o nome, a área e o perímetro do círculo
print(circ:getName())
print(circ:getArea())
print(circ:getPerimeter())
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