Menu
Coddy logo textTech

Множественные интерфейсы

Часть раздела Объектно-ориентированное программирование путешествия по 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, гарантируя, что он может выполнять всё, что требует каждый интерфейс, сохраняя при этом свою собственную уникальную реализацию.

challenge icon

Задание

Легко

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

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

  • 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')
  
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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