Repaso: calculadora de formas
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 25 de 65.
Desafío
IntermedioConstruye una calculadora de figuras que gestione figuras reales, un objeto similar a una figura que no pertenezca a la jerarquía y objetos que no pueda medir.
Shapees abstracta, con los métodos abstractosarea() -> float,perimeter() -> floatyshape_name() -> String. Su método normaldescribe()devuelveNAME: area A, perimeter Pcon dos decimales.Circle(radius),Rectangle(width,height) yTriangle(ladosa,b,c) extiendenShape. Sus nombres sonCircle,RectangleyTriangle. El área de un círculo esPI * r * ry su perímetro2 * PI * r. Para el triángulo, usa la fórmula de Herón: cons = (a + b + c) / 2, el área essqrt(s * (s - a) * (s - b) * (s - c)).CustomShapeNO extiendeShape. Tiene uncustom_namey unsize;area()essize * size,perimeter()es4 * sizeydescribe()usa el mismo formato queShape, con su nombre personalizado.ShapeCalculatortiene dos funciones estáticas.process(thing)devuelve[Shape]másdescribe()para unShape,[Duck]másdescribe()para cualquier otro objeto que tenga un métododescribe(), yCannot measure this objecten caso contrario.total_area(things)sumaarea()de todos los objetos que tengan un métodoarea().
El código proporcionado lee cuántos objetos siguen y, después, uno por línea: circle R, rectangle W H, triangle A B C, custom NAME SIZE o unknown (un objeto RefCounted simple). Imprime process() para cada uno y el área total. Para circle 5, custom Hexa 3 y 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.54Tu código va en shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd y shape_calculator.gd. main.gd contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
extends Node
func _ready():
# Código de entrada/salida proporcionado: mantenlo tal 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 las lecciones de Programación orientada a objetos
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online