Revisão - Calculadora de Formas
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 25 de 65.
Desafio
MédioCrie uma calculadora de formas que lide com formas reais, um objeto semelhante a uma forma, mas que esteja fora da hierarquia, e objetos que ela não consiga medir.
Shapeé abstrata, com os métodos abstratosarea() -> float,perimeter() -> floateshape_name() -> String. Seu método normaldescribe()retornaNAME: area A, perimeter Pcom duas casas decimais.Circle(radius),Rectangle(width,height) eTriangle(ladosa,b,c) estendemShape. Seus nomes sãoCircle,RectangleeTriangle. A área de um círculo éPI * r * re seu perímetro,2 * PI * r. Para o triângulo, use a fórmula de Heron: coms = (a + b + c) / 2, a área ésqrt(s * (s - a) * (s - b) * (s - c)).CustomShapeNÃO estendeShape. Ela tem umcustom_namee umsize;area()ésize * size,perimeter()é4 * size, edescribe()usa o mesmo formato queShape, com seu nome personalizado.ShapeCalculatortem duas funções estáticas.process(thing)retorna[Shape]maisdescribe()para umShape,[Duck]maisdescribe()para qualquer outro objeto que tenha um métododescribe(), eCannot measure this objectnos demais casos.total_area(things)soma o resultado dearea()de cada objeto que tenha um métodoarea().
O código fornecido lê quantos objetos vêm a seguir e, então, um por linha: circle R, rectangle W H, triangle A B C, custom NAME SIZE ou unknown (um objeto simples RefCounted). Ele imprime process() para cada um e a área total. Para circle 5, custom Hexa 3 e unknown, imprime:
[Shape] Circle: area 78.54, perimeter 31.42
[Duck] Hexa: area 9.00, perimeter 12.00
Cannot measure this object
Total area: 87.54Seu código deve ficar em shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd e shape_calculator.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
extends Node
func _ready():
# Código de entrada/saída fornecido: mantenha-o como está
var count := int(OS.read_string_from_stdin())
var things := []
for i in count:
var p := OS.read_string_from_stdin().split(" ")
if p[0] == "circle":
things.append(Circle.new(float(p[1])))
elif p[0] == "rectangle":
things.append(Rectangle.new(float(p[1]), float(p[2])))
elif p[0] == "triangle":
things.append(Triangle.new(float(p[1]), float(p[2]), float(p[3])))
elif p[0] == "custom":
things.append(CustomShape.new(p[1], float(p[2])))
else:
things.append(RefCounted.new())
for thing in things:
print(ShapeCalculator.process(thing))
print("Total area: %.2f" % ShapeCalculator.total_area(things))
Todas as lições de Programação orientada a objetos
1Fundamentos da POO
Arquivos externosIntrodução à POOClasses vs. objetosA palavra-chave selfMétodosPropriedadesConstrutor (_init)Revisão - Calculadora simples4Polimorfismo
Revisitando a Sobrescrita de MétodosDuck TypingClasses e Métodos AbstratosDesign de InterfacesRevisão - Calculadora de Formas7Sinais
O que é um sinal?Declarando e emitindoConectando-se a sinaisSinais com argumentosRevisão - Sistema de saúde10Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite2Propriedades de Classe
Variáveis de Instância vs. EstáticasFunções EstáticasMétodos Setters de PropriedadeMétodos Getters de PropriedadePrivado por ConvençãoRecapitulando: Gerenciador de Conta Bancária5Encapsulamento
Membros públicos e privadosValidação com settersOcultação de informaçõesPropriedades somente para leituraRevisão - Sistema de registros de alunos8Conceitos Avançados de POO
Composição vs. HerançaClasses InternasNós como ComponentesRefCounted vs. NodeEnums em Classes3Herança
Herança básicaA palavra-chave superSobrescrita de métodosCadeias de herançaVerificações de tipo com isRevisão - Hierarquia de funcionários6Métodos especiais
Introdução aos métodos virtuaisO método _to_stringIteradores personalizadosRevisão - Lista personalizada9Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de GDScript online