08. Абстракция
Абстрактные классы в программировании — это как черновики или шаблоны для создания других классов. Эти классы предназначены для того, чтобы задать базовую структуру, но сами по себе они не могут использоваться напрямую.
Что такое абстрактный класс?
Абстрактный класс:
Не может быть создан как объект. Нельзя создать экземпляр абстрактного класса, он предназначен только для наследования.
Может содержать абстрактные методы, которые не имеют тела и должны быть реализованы в дочерних классах.
Может содержать обычные методы и свойства, которые дочерние классы могут унаследовать и использовать.
Зачем нужен абстрактный класс?
Абстрактные классы нужны, чтобы:
Создать общий шаблон с методами и свойствами, которые потом будут реализованы конкретными дочерними классами.
Задать обязательные методы, которые наследники должны реализовать. Это помогает поддерживать единообразие, чтобы классы, которые наследуются от абстрактного класса, обязательно имели определенные функции.
Пример с аналогией
Представьте, что у нас есть абстрактный класс "Животное". В этом классе мы можем задать шаблон: у каждого животного есть метод makeSound()
для звука, который оно издает. Но сам класс "Животное" не определяет конкретный звук, потому что у каждого вида он свой.
Теперь, если мы создаем класс "Кошка" или "Собака", мы обязаны реализовать метод makeSound()
.
Как создать абстрактный класс в Dart
Используем ключевое слово abstract
перед определением класса.
Примеры использования абстрактных классов
Форма (Shape) — абстрактный класс с методом
draw()
. Разные фигуры (например, круг, квадрат) будут наследоватьShape
и реализовывать собственный способ отрисовки.Транспортное средство (Vehicle) — у него есть метод
move()
, который будет разным у машины, самолета или лодки. Каждый тип транспорта реализует свой способ передвижения.Платежная система (Payment) — абстрактный класс с методом
processPayment()
. Дочерние классы могут представлять разные платежные системы:CreditCardPayment
,PaypalPayment
, которые реализуют метод по-своему.Документ (Document) — у каждого документа есть метод
printDocument()
, который будет разным для PDF и Word документов.Животное (Animal) — как в примере выше, есть абстрактный класс
Animal
с абстрактным методомmakeSound()
.
Итоги
Абстрактные классы помогают создавать шаблоны для других классов и требовать реализации определённых методов в дочерних классах. Это экономит время и делает код более единообразным.
Пример:
Создадим мини-приложение для отображения разных типов уведомлений: Сообщения и Уведомления о звонках. Будем использовать абстрактный класс для создания общего шаблона уведомления, от которого разные уведомления унаследуют свои уникальные особенности. Абстрактный класс будет требовать реализации метода showNotification()
для отображения уведомлений.
Почему абстрактные классы?
Абстрактный класс здесь нужен, чтобы задать общую структуру для всех уведомлений, но позволить каждому типу уведомления реализовать собственное поведение. Например, уведомление о сообщении может показывать текст, а уведомление о звонке — имя звонящего.
Структура приложения
Абстрактный класс
Notification
— задаёт базовый шаблон для всех уведомлений с методомshowNotification()
.Класс
MessageNotification
— отображает текст сообщения.Класс
CallNotification
— отображает имя звонящего.Главный экран — выводит список уведомлений, использует
ListView
для отображения каждого уведомления.
Код приложения
Объяснение кода
Абстрактный класс
Notification
— создаёт шаблон для уведомлений, задавая свойстваtitle
иtime
, а также абстрактный методshowNotification()
. Этот метод обязателен для реализации в дочерних классах.Класс
MessageNotification
— расширяетNotification
, добавляет свойствоmessage
и реализует методshowNotification()
, который выводит текст сообщения.Класс
CallNotification
— также расширяетNotification
, добавляетcallerName
и реализуетshowNotification()
, чтобы отображать информацию о звонящем.Экран уведомлений (
NotificationScreen
) — создаёт список уведомлений разного типа и отображает их вListView
. При нажатии на уведомление вызываетсяshowNotification()
, который отображает нужное сообщение в зависимости от типа уведомления.
Почему мы используем абстрактные классы?
Общий шаблон: Абстрактный класс
Notification
позволяет создать общую структуру, которую реализуют все уведомления, добавляя к ней уникальные данные (например, сообщение или имя звонящего).Гибкость: Каждый дочерний класс может определить собственную реализацию
showNotification()
, что делает код гибким и расширяемым.Удобство: Можно хранить все объекты в одном списке типа
Notification
и вызывать методы поочередно, не задумываясь о том, к какому типу конкретное уведомление относится.
Такой подход с абстрактными классами делает код удобнее и помогает разделить общий функционал и уникальные особенности каждого типа уведомлений.
Last updated