Menu
Coddy logo textTech

Итоги: Иерархия фигур

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 36 из 70.

challenge icon

Задание

Легко

Давайте с нуля создадим полную иерархию фигур! Вы создадите родительский Shape class, от которого будут наследовать all shapes, а затем создадите дочерние classes Circle и Square, у каждого из которых будут собственные уникальные свойства при сохранении общей функциональности.

Вы организуете код в четырёх файлах:

  • Shape.lua: Ваш базовый class, от которого будут наследовать all shapes. В нём должны быть constructor :new(color), сохраняющий цвет shape, и method :getColor(), возвращающий его. Благодаря этому общему свойству каждая shape, будь то circle или square, будет иметь цвет.
  • Circle.lua: Дочерний class, который inherits from Shape. Его constructor :new(color, radius) должен вызвать parent constructor для цвета, а затем добавить radius как уникальный атрибут. Добавьте method :describe(), который выводит сведения о circle.
  • Square.lua: Ещё один дочерний class, inherits from Shape. Его constructor :new(color, side) также должен вызвать parent constructor, а затем сохранить длину side. Также добавьте method :describe() для square.
  • main.lua: Bring everything together, создав экземпляры обеих shapes и продемонстрировав, что они корректно наследуют свойства от Shape, сохраняя при этом свои уникальные свойства.

Вы получите два входных значения:

  1. Данные Circle: color и radius, разделённые запятой (например, blue,5)
  2. Данные Square: color и длина side, разделённые запятой (например, red,4)

В вашем основном файле создайте Circle и Square с заданными значениями. Затем выведите в отдельных строках:

  1. Call :describe() для circle
  2. Call :describe() для square
  3. Выведите цвет circle с использованием :getColor()
  4. Выведите цвет square с использованием :getColor()

Method :describe() для Circle должен выводить:

Circle with radius {radius}

Method :describe() для Square должен выводить:

Square with side {side}

Например, если входные значения — blue,5 и red,4, результатом должен быть:

Circle with radius 5
Square with side 4
blue
red

Это демонстрирует полный шаблон наследования: обе shapes наследуют :getColor() от Shape (они никогда не определяют его самостоятельно), а каждая имеет собственный уникальный атрибут и method :describe()!

Попробуйте сами

-- main.lua: Собери всё вместе

local Circle = require('Circle')
local Square = require('Square')

-- Прочитай ввод для круга (color,radius)
local circleInput = io.read()
local circleColor, circleRadius = circleInput:match("([^,]+),([^,]+)")
circleRadius = tonumber(circleRadius)

-- Прочитай ввод для квадрата (color,side)
local squareInput = io.read()
local squareColor, squareSide = squareInput:match("([^,]+),([^,]+)")
squareSide = tonumber(squareSide)

-- TODO: Создай экземпляр Circle с заданным цветом и радиусом

-- TODO: Создай экземпляр Square с заданным цветом и стороной

-- TODO: Вызови :describe() у круга

-- TODO: Вызови :describe() у квадрата

-- TODO: Выведи цвет круга с помощью :getColor()

-- TODO: Выведи цвет квадрата с помощью :getColor()

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua