🧑‍🏫08. Абстракция

Абстрактные классы в программировании — это как черновики или шаблоны для создания других классов. Эти классы предназначены для того, чтобы задать базовую структуру, но сами по себе они не могут использоваться напрямую.

Что такое абстрактный класс?

Абстрактный класс:

  1. Не может быть создан как объект. Нельзя создать экземпляр абстрактного класса, он предназначен только для наследования.

  2. Может содержать абстрактные методы, которые не имеют тела и должны быть реализованы в дочерних классах.

  3. Может содержать обычные методы и свойства, которые дочерние классы могут унаследовать и использовать.

Зачем нужен абстрактный класс?

Абстрактные классы нужны, чтобы:

  1. Создать общий шаблон с методами и свойствами, которые потом будут реализованы конкретными дочерними классами.

  2. Задать обязательные методы, которые наследники должны реализовать. Это помогает поддерживать единообразие, чтобы классы, которые наследуются от абстрактного класса, обязательно имели определенные функции.

Пример с аналогией

Представьте, что у нас есть абстрактный класс "Животное". В этом классе мы можем задать шаблон: у каждого животного есть метод makeSound() для звука, который оно издает. Но сам класс "Животное" не определяет конкретный звук, потому что у каждого вида он свой.

abstract class Animal {
  void makeSound(); // абстрактный метод
}

Теперь, если мы создаем класс "Кошка" или "Собака", мы обязаны реализовать метод makeSound().

class Cat extends Animal {
  @override
  void makeSound() {
    print('Мяу');
  }
}

class Dog extends Animal {
  @override
  void makeSound() {
    print('Гав');
  }
}

Как создать абстрактный класс в Dart

Используем ключевое слово abstract перед определением класса.

Примеры использования абстрактных классов

  1. Форма (Shape) — абстрактный класс с методом draw(). Разные фигуры (например, круг, квадрат) будут наследовать Shape и реализовывать собственный способ отрисовки.

  2. Транспортное средство (Vehicle) — у него есть метод move(), который будет разным у машины, самолета или лодки. Каждый тип транспорта реализует свой способ передвижения.

  3. Платежная система (Payment) — абстрактный класс с методом processPayment(). Дочерние классы могут представлять разные платежные системы: CreditCardPayment, PaypalPayment, которые реализуют метод по-своему.

  4. Документ (Document) — у каждого документа есть метод printDocument(), который будет разным для PDF и Word документов.

  5. Животное (Animal) — как в примере выше, есть абстрактный класс Animal с абстрактным методом makeSound().

Итоги

Абстрактные классы помогают создавать шаблоны для других классов и требовать реализации определённых методов в дочерних классах. Это экономит время и делает код более единообразным.

Пример:

Создадим мини-приложение для отображения разных типов уведомлений: Сообщения и Уведомления о звонках. Будем использовать абстрактный класс для создания общего шаблона уведомления, от которого разные уведомления унаследуют свои уникальные особенности. Абстрактный класс будет требовать реализации метода showNotification() для отображения уведомлений.

Почему абстрактные классы?

Абстрактный класс здесь нужен, чтобы задать общую структуру для всех уведомлений, но позволить каждому типу уведомления реализовать собственное поведение. Например, уведомление о сообщении может показывать текст, а уведомление о звонке — имя звонящего.

Структура приложения

  1. Абстрактный класс Notification — задаёт базовый шаблон для всех уведомлений с методом showNotification().

  2. Класс MessageNotification — отображает текст сообщения.

  3. Класс CallNotification — отображает имя звонящего.

  4. Главный экран — выводит список уведомлений, использует ListView для отображения каждого уведомления.

Код приложения

Объяснение кода

  1. Абстрактный класс Notification — создаёт шаблон для уведомлений, задавая свойства title и time, а также абстрактный метод showNotification(). Этот метод обязателен для реализации в дочерних классах.

  2. Класс MessageNotification — расширяет Notification, добавляет свойство message и реализует метод showNotification(), который выводит текст сообщения.

  3. Класс CallNotification — также расширяет Notification, добавляет callerName и реализует showNotification(), чтобы отображать информацию о звонящем.

  4. Экран уведомлений (NotificationScreen) — создаёт список уведомлений разного типа и отображает их в ListView. При нажатии на уведомление вызывается showNotification(), который отображает нужное сообщение в зависимости от типа уведомления.

Почему мы используем абстрактные классы?

  1. Общий шаблон: Абстрактный класс Notification позволяет создать общую структуру, которую реализуют все уведомления, добавляя к ней уникальные данные (например, сообщение или имя звонящего).

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

  3. Удобство: Можно хранить все объекты в одном списке типа Notification и вызывать методы поочередно, не задумываясь о том, к какому типу конкретное уведомление относится.

Такой подход с абстрактными классами делает код удобнее и помогает разделить общий функционал и уникальные особенности каждого типа уведомлений.

Last updated