Повторение — калькулятор фигур
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 25 из 65.
Задание
СреднеСоздайте калькулятор фигур, который обрабатывает настоящие фигуры, похожий на фигуру объект вне иерархии и объекты, которые он не может измерить.
Shape— абстрактный класс с абстрактными методамиarea() -> float,perimeter() -> floatиshape_name() -> String. Его обычный методdescribe()возвращаетNAME: area A, perimeter Pс двумя знаками после запятой.Circle(radius),Rectangle(width,height) иTriangle(стороныa,b,c) наследуются отShape. Их названия —Circle,RectangleиTriangle. Площадь круга равнаPI * r * r, а его периметр —2 * PI * r. Для треугольника используйте формулу Герона: приs = (a + b + c) / 2площадь равнаsqrt(s * (s - a) * (s - b) * (s - c)).CustomShapeНЕ наследуется отShape. У него естьcustom_nameиsize;area()равенsize * size,perimeter()равен4 * size, аdescribe()использует тот же формат, что иShape, с пользовательским названием.ShapeCalculatorсодержит две статические функции.process(thing)возвращает[Shape]и результатdescribe()для объектаShape,[Duck]и результатdescribe()для любого другого объекта, у которого есть методdescribe(), иCannot measure this objectв противном случае.total_area(things)складывает результатыarea()для каждого объекта, у которого есть методarea().
Предоставленный код считывает количество следующих объектов, затем по одному объекту в строке: circle R, rectangle W H, triangle A B C, custom NAME SIZE или unknown (обычный объект RefCounted). Для circle 5, custom Hexa 3 и unknown он выводит:
[Shape] Circle: area 78.54, perimeter 31.42
[Duck] Hexa: area 9.00, perimeter 12.00
Cannot measure this object
Total area: 87.54Ваш код нужно разместить в файлах shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd и shape_calculator.gd. В main.gd находится предоставленный код ввода/вывода, который нельзя редактировать.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода-вывода: оставьте его без изменений
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))
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript