Множественные интерфейсы
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 48 из 110.
Одним из самых больших преимуществ интерфейсов перед наследованием является то, что класс может реализовывать несколько интерфейсов. В то время как Dart ограничивает вас расширением только одного класса, вы можете реализовать столько интерфейсов, сколько вам нужно.
abstract class Printable {
void printContent();
}
abstract class Saveable {
void save();
}
abstract class Shareable {
void share(String recipient);
}
class Document implements Printable, Saveable, Shareable {
String content;
Document(this.content);
@override
void printContent() {
print('Printing: $content');
}
@override
void save() {
print('Saving document...');
}
@override
void share(String recipient) {
print('Sharing with $recipient');
}
}При реализации нескольких интерфейсов вы должны предоставить реализации для всех методов каждого интерфейса. Класс должен выполнять все контракты, которые он обязуется поддерживать.
Вы также можете комбинировать extends с несколькими implements:
class Report extends Document implements Printable, Shareable {
Report(String content) : super(content);
// Все еще необходимо реализовать все методы интерфейса
// (в данном случае уже унаследовано от Document)
}Эта гибкость позволяет вам проектировать классы, которые подходят для нескольких ролей. SmartPhone может реализовывать интерфейсы Camera, Phone и MusicPlayer, гарантируя, что он может выполнять всё, что требует каждый интерфейс, сохраняя при этом свою собственную уникальную реализацию.
Задание
ЛегкоДавайте создадим систему умных устройств, которая демонстрирует, как один класс может реализовывать несколько интерфейсов для объединения различных возможностей. Вы создадите отдельные классы-интерфейсы для различных функций устройства, а затем создадите устройство, которое может делать все это.
Вы организуете свой код в два файла:
devices.dart: Определите здесь свои интерфейсы и реализующий класс:- Класс
Connectableс методомconnect(), который выводитConnecting to network... - Класс
Chargeableс методомcharge(), который выводитCharging battery... - Класс
Displayableс методомshowScreen(String content), который выводитDisplaying: [content] - Класс
Tablet, который реализует все три интерфейса:Connectable,ChargeableиDisplayable. Добавьте свойствоString brandс конструктором. Ваши реализации должны выводить[brand] tablet connecting to WiFiдля connect,[brand] tablet charging via USB-Cдля charge и[brand] screen: [content]для showScreen
- Класс
main.dart: Импортируйте файл устройств и продемонстрируйте, как Tablet выполняет контракты всех трех интерфейсов:- Создайте
Tabletс брендом'Galaxy' - Вызовите
connect() - Вызовите
charge() - Вызовите
showScreen('Welcome Home')
- Создайте
Ваш класс Tablet должен предоставить собственную реализацию для каждого метода из всех трех интерфейсов. Это показывает, как реализация нескольких интерфейсов позволяет одному классу гарантировать наличие нескольких возможностей, сохраняя при этом уникальность каждой реализации для конкретного устройства.
Ожидаемый вывод:
Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome HomeШпаргалка
Класс может реализовывать несколько интерфейсов, перечисляя их через запятую после ключевого слова implements:
abstract class Printable {
void printContent();
}
abstract class Saveable {
void save();
}
class Document implements Printable, Saveable {
@override
void printContent() {
print('Printing...');
}
@override
void save() {
print('Saving...');
}
}При реализации нескольких интерфейсов вы должны предоставить реализации для всех методов каждого интерфейса.
Вы можете комбинировать extends с несколькими implements:
class Report extends Document implements Printable, Shareable {
Report(String content) : super(content);
// Необходимо реализовать все методы интерфейса
}Это позволяет классу выполнять несколько контрактов и одновременно соответствовать нескольким ролям.
Попробуйте сами
import 'devices.dart';
void main() {
// TODO: Создайте Tablet с брендом 'Galaxy'
// TODO: Вызовите connect()
// TODO: Вызовите charge()
// TODO: Вызовите showScreen('Welcome Home')
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий