Área Total
Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 60 de 70.
Desafio
FácilVamos adicionar um recurso poderoso ao seu ShapeCollection—a capacidade de calcular a área total de todas as formas que ele contém. É aqui que o polimorfismo realmente brilha: sua coleção pode chamar :getArea() em qualquer forma sem saber se é um retângulo ou um círculo.
Você continuará construindo sobre os arquivos do seu projeto existente:
Shape.lua: Sua classe base Shape (inalterada).Rectangle.lua: Sua classe Rectangle com:getArea()e:getPerimeter().Circle.lua: Sua classe Circle com:getArea()e:getPerimeter().ShapeCollection.lua: Estenda sua classe de coleção adicionando um método:getTotalArea(). Este método deve iterar por todas as formas armazenadas, chamar:getArea()em cada uma e retornar a soma de todas as áreas.main.lua: Importe seus módulos, leia as dimensões da entrada, crie um Rectangle e um Circle, adicione ambos a um ShapeCollection e, em seguida, imprima a área total de todas as formas na coleção.
A beleza dessa abordagem é que :getTotalArea() não precisa de lógica separada para retângulos e círculos—ele simplesmente confia que cada forma na coleção possui um método :getArea(). Você poderia adicionar triângulos, hexágonos ou qualquer outra forma mais tarde, e o cálculo da área total funcionaria sem modificações.
Entrada: Três linhas—largura (número), altura (número) e raio (número).
Saída: Uma única linha contendo a área total de todas as formas na coleção.
Experimente você mesmo
-- Requer o módulo Rectangle
local Rectangle = require('Rectangle')
-- Requer o módulo Circle
local Circle = require('Circle')
-- Requer o módulo ShapeCollection
local ShapeCollection = require('ShapeCollection')
-- 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 fornecidas
local rect = Rectangle:new(width, height)
-- Cria uma nova instância de Circle com o raio fornecido
local circ = Circle:new(radius)
-- Cria uma nova ShapeCollection
local collection = ShapeCollection:new()
-- Adiciona ambas as formas à coleção
collection:addShape(rect)
collection:addShape(circ)
-- Imprime a área total de todas as formas na coleção
print(collection:getTotalArea())
Todas as lições de Object Oriented Programming
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ângulo2Padrã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 Formas