Итоги: Система животных
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 56 из 110.
Задание
ЛегкоДавайте создадим полноценную систему животных, которая объединит все, что вы узнали о примесях (mixins)! Вы создадите базовый класс Animal, примеси поведения, использующие ключевое слово on, и конкретные классы животных, которые по-разному комбинируют эти возможности.
Вы организуете свой код в три файла:
animal.dart: Определите базовый класс, от которого будут наследоваться все животные:- Класс
Animalсо свойствомString nameи конструктором - Метод
describe(), который выводит[name] is an animal
- Класс
behaviors.dart: Импортируйте файл animal и создайте три примеси поведения, каждая из которых ограничена классомAnimalс помощью ключевого словаon:- Примесь
Swimmingс методомswim(), который выводит[name] is swimming - Примесь
Flyingс методомfly(), который выводит[name] is flying - Примесь
Walkingс методомwalk(), который выводит[name] is walking
- Примесь
main.dart: Импортируйте оба файла и создайте три класса животных, которые сочетают наследование с различными комбинациями примесей:- Класс
Duck, который расширяетAnimalи использует все три примеси (Swimming, Flying, Walking) - Класс
Fish, который расширяетAnimalи использует только примесьSwimming - Класс
Bird, который расширяетAnimalи использует примесиFlyingиWalking
- Создайте
Duckс именем'Donald', вызовитеdescribe(), затемswim(),fly()иwalk() - Выведите пустую строку
- Создайте
Fishс именем'Nemo', вызовитеdescribe(), затемswim() - Выведите пустую строку
- Создайте
Birdс именем'Tweety', вызовитеdescribe(), затемfly()иwalk()
- Класс
Каждая примесь может получить доступ к свойству name благодаря ограничению on Animal, что обеспечивает типизацию и гибкую композицию поведения.
Ожидаемый результат:
Donald is an animal
Donald is swimming
Donald is flying
Donald is walking
Nemo is an animal
Nemo is swimming
Tweety is an animal
Tweety is flying
Tweety is walkingПопробуйте сами
import 'animal.dart';
import 'behaviors.dart';
// TODO: Создайте класс Duck, который расширяет Animal и использует миксины Swimming, Flying, Walking
class Duck {
// TODO: Реализуйте класс Duck
}
// TODO: Создайте класс Fish, который расширяет Animal и использует только миксин Swimming
class Fish {
// TODO: Реализуйте класс Fish
}
// TODO: Создайте класс Bird, который расширяет Animal и использует миксины Flying и Walking
class Bird {
// TODO: Реализуйте класс Bird
}
void main() {
// TODO: Создайте объект Duck с именем 'Donald'
// Вызовите методы describe(), swim(), fly(), walk()
// TODO: Выведите пустую строку
// TODO: Создайте объект Fish с именем 'Nemo'
// Вызовите методы describe(), swim()
// TODO: Выведите пустую строку
// TODO: Создайте объект Bird с именем 'Tweety'
// Вызовите методы describe(), fly(), walk()
}
Все уроки раздела Объектно-ориентированное программирование
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
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий