Итоги — Калькулятор фигур
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 49 из 110.
Задание
ЛегкоДавайте создадим систему калькулятора фигур, которая объединяет абстрактные классы и интерфейсы для создания гибкого набора инструментов геометрии. Вы разработаете иерархию классов, в которой различные фигуры разделяют общее поведение через абстракцию, в то время как каждая фигура предоставляет свои собственные уникальные вычисления.
Вы организуете свой код в три файла:
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()
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий