Menu
Coddy logo textTech

Итоги — Калькулятор фигур

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 49 из 110.

challenge icon

Задание

Легко

Давайте создадим систему калькулятора фигур, которая объединяет абстрактные классы и интерфейсы для создания гибкого набора инструментов геометрии. Вы разработаете иерархию классов, в которой различные фигуры разделяют общее поведение через абстракцию, в то время как каждая фигура предоставляет свои собственные уникальные вычисления.

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

  • shape.dart: Определите здесь свой абстрактный базовый класс и интерфейс:
    • Абстрактный класс Shape со свойством String name и конструктором. Включите абстрактные методы double calculateArea() и double calculatePerimeter(). Добавьте обычный метод describe(), который выводит '$name - Area: ${calculateArea()}, Perimeter: ${calculatePerimeter()}'
    • Класс Drawable с методом draw(), который выводит 'Drawing shape...'
  • shapes.dart: Импортируйте shape.dart и создайте свои конкретные классы фигур:
    • Класс Rectangle, который расширяет Shape и реализует Drawable. Добавьте свойства double width и double height. Рассчитайте площадь как width * height и периметр как 2 * (width + height). Метод draw() должен выводить 'Drawing rectangle ${width}x$height'
    • Класс Circle, который расширяет Shape и реализует Drawable. Добавьте свойство double radius. Используйте 3.14159 для числа пи. Рассчитайте площадь как pi * radius * radius и периметр (длину окружности) как 2 * pi * radius. Метод draw() должен выводить 'Drawing circle with radius $radius'
  • main.dart: Импортируйте shapes.dart и продемонстрируйте работу вашего калькулятора фигур:
    • Создайте Rectangle с именем 'Rectangle', шириной 5.0 и высотой 3.0
    • Создайте Circle с именем 'Circle' и радиусом 4.0
    • Для каждой фигуры вызовите draw(), а затем describe()
    • Выведите пустую строку между двумя фигурами

Эта задача демонстрирует, как абстрактные классы определяют общую структуру (каждая фигура имеет расчеты площади и периметра), в то время как интерфейсы добавляют дополнительные возможности (фигуры, которые можно нарисовать). Каждый конкретный класс расширяет абстрактный класс для своей основной идентичности и реализует интерфейс для дополнительной функциональности.

Ожидаемый вывод:

Drawing rectangle 5.0x3.0
Rectangle - Area: 15.0, Perimeter: 16.0

Drawing circle with radius 4.0
Circle - Area: 50.26544, Perimeter: 25.13272

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

import 'shapes.dart';

void main() {
  // TODO: Создайте Rectangle с именем 'Rectangle', шириной 5.0 и высотой 3.0
  
  // TODO: Создайте Circle с именем 'Circle' и радиусом 4.0
  
  // TODO: Для rectangle вызовите draw(), затем describe()
  
  // TODO: Выведите пустую строку
  
  // TODO: Для circle вызовите draw(), затем describe()
}

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