👨‍💻
Flutter
  • 👨‍💻Flutter lessons
    • 🎨Flutter ui
      • 🚵‍♂️Travel app
        • 📱1. Lesson
        • 📱2.Lesson
      • 📚Books store
      • 🧑‍⚕️Doctor app
      • 🚖Taxi app
    • 🐦Основы Flutter
      • Page 1
      • Page 2
      • 🧑‍🏫Урок 1: Основные виджеты Flutter
        • Page
        • 🧩Container()
        • 🧩AppBar()
        • 🧩Text()
        • 🧩Icon()
        • 🧩Column()
        • 🧩Row()
        • 🧩TextButton()
        • 🧩ElevatedButton()
      • 🧑‍🏫Урок 2: Создаем UI
      • 🧑‍🏫Урок 3: Создаем UI
      • 🧑‍🏫Урок 4: Создаем UI
    • 🧩Основы dart
      • 🧑‍🏫01. Переменные часть 1
      • 🧑‍🏫01. Переменные часть 2
      • 🧑‍🏫02. Функции
      • 🧑‍🏫03. Условные операторы
      • 🧑‍🏫04. List
      • 🧑‍🏫05. Map
      • 🧑‍🏫06. Class
      • 🧑‍🏫07. Наследование
      • 🧑‍🏫08. Абстракция
      • 🧑‍🏫09. Интерфейсы
      • 🧑‍🏫10. Инкапсуляция
      • 🧑‍🏫11. Mixin
      • 🧑‍🏫12. Асинхронное программирование
      • 🧑‍🏫13. Streams
      • 🎯Final project
        • 🥦Grocery app
        • 🏠Home
    • ⚒️State management
      • ⬛Bloc
        • 1. Введение cubit
          • 1.1 Пример
          • 1.2 Пример
          • 1.3 Пример
          • 1.4 Пример
          • 1.5 Пример
        • 2. Введение в Bloc
      • 🌊Riverpod
    • 🏠Architechture
      • Clean Architechture
      • Bloc
    • 📲Locale storage
      • 🐝Hive
        • 🐝Ui
        • 🐝Hive - локальное хранилище: Введение
        • 🐝Hive - task app: часть 1
        • 🐝Hive - task app: часть 2
        • 🐝Hive - task app: часть 3
        • 🐝Hive - task app: часть 4
        • 🐝Hive - task app: часть 5
      • 🟩Sql
    • 📡Server
      • 📡Server - Lesson01 introduction
      • 📡Server - Lesson02 get data
      • 📡Server - Lesson03 News App get data
    • 🖥️Готовый backend
      • Firebase
      • Supabase
  • 🎯Dart practise
    • 🧑‍💻Переменные
      • 🧑‍💻String
      • 🧑‍💻int
      • 🧑‍💻double
      • 🧑‍💻bool
    • 🧑‍💻Функции
      • 🧑‍💻Обычные функции
      • 🧑‍💻Порядковые параметры
      • 🧑‍💻Обязательные параметры
      • 🧑‍💻Параметры по умолчанию
      • 🧑‍💻Функции-стрелки
      • 🧑‍💻Возвращаемые функции
    • 🧑‍💻Условные операторы
      • 🧑‍💻if/else
      • 🧑‍💻switch/case
      • 🧑‍💻тернарный оператор
    • 🧑‍💻Структура данных
      • 🧑‍💻List
      • 🧑‍💻Map
      • 🧑‍💻Set
    • 🧑‍💻ООП
  • 🧩Flutter Widgets
    • 💻Все виджеты
    • 🎞️Анимации
      • 🧩AnimatedContainer
      • 🧩AnimatedOpacity
      • 🧩AnimatedAlign
      • 🧩AnimatedCrossFade
      • 🧩Hero
      • 🧩AnimatedBuilder
      • 🧩AnimatedPositioned
      • 🧩AnimatedSwitcher
    • 🏗️Манипуляция пространством
      • 🧩Padding
      • 🧩SizedBox
      • 🧩Align
      • 🧩Center
      • 🧩Expanded
      • 🧩Flexible
      • 🧩Spacer
      • 🧩Column
      • 🧩Stack
      • 🧩Row
    • ✍️Отображение текста
      • 🧩RichText
      • 🧩FittedBox
      • 🧩SelectableText
      • 🧩Text
    • 📸Отображение изображений
      • 🧩Image()
      • 🧩Image.network
      • 🧩Image.asset
      • 🧩Image.file
      • 🧩Image.memory
      • 🧩FadeInImage
      • 🧩NetworkImage
      • 🧩AssetImage
    • 📃Списки и прокрутка
      • 🧩ListView()
      • 🧩ListView.builder()
      • 🧩GridView()
      • 🧩GridView.builder()
      • 🧩PageView()
      • 🧩SingleChildScrollView
      • 🧩CustomScrollView
      • 🧩ReorderableListView
      • 🧩NestedScrollView
    • ⌨️Кнопки
      • 🧩TextButton()
      • 🧩ElevatedButton()
      • 🧩IconButton()
      • 🧩DropDownButton()
      • 🧩FloatingActionButton
      • 🧩Checkbox
      • 🧩Radio
      • 🧩Switch
      • 🧩Slider
    • 📝Формы и ввод данных
      • 🧩TextField()
      • 🧩TextFormField
      • 🧩Form
      • 🧩FormField
      • 🧩DatePicker
      • 🧩TimePicker
    • 🧑‍🏫Диалоги и всплывающие окна
      • 🧩AlertDialog
      • 🧩SimpleDialog
      • 🧩BottomSheet
      • 🧩ExpansionPanel
      • 🧩SnackBar
      • 🧩PopupMenuButton
      • 🧩Tooltip
      • 🧩Dialog
    • 🛣️Навигация
      • 🧩BottomNavigationBar()
      • 🧩Navigator
      • 🧩Drawer
      • 🧩TabBar
    • 📱Отображение на экране
      • 🧩Scaffold
      • 🧩Container()
      • 🧩AppBar()
      • 🧩Icon()
      • 🧩Stepper()
  • 🎮Flutter Flame
    • Введение в разработку игр
  • 🔬Flutter projects
  • 🧑‍🎓Homeworks for everyday
    • 🧑‍🎓0. Переменные
    • 🧑‍🎓1. Функции - 1
    • 🧑‍🎓2. Функции - 2
    • 🧑‍🎓3. Условные операторы
    • 🧑‍🎓4. List
    • 🧑‍🎓5. Map
    • 🧑‍🎓6. class
    • 🐝Hive -
    • 🐝Hive clean architecture
    • 📡HTTP
    • 📡HTTP clean architecture
    • 💾Firebase
    • 💾Firebase clean architecture
Powered by GitBook
On this page
  1. Flutter lessons
  2. Основы dart

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 перед определением класса.

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

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

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

    abstract class Shape {
      void draw();
    }
    
    class Circle extends Shape {
      @override
      void draw() {
        print('Рисуем круг');
      }
    }
    
    class Square extends Shape {
      @override
      void draw() {
        print('Рисуем квадрат');
      }
    }
  2. Транспортное средство (Vehicle) — у него есть метод move(), который будет разным у машины, самолета или лодки. Каждый тип транспорта реализует свой способ передвижения.

    abstract class Vehicle {
      void move();
    }
    
    class Car extends Vehicle {
      @override
      void move() {
        print('Машина едет по дороге');
      }
    }
    
    class Airplane extends Vehicle {
      @override
      void move() {
        print('Самолет летит в воздухе');
      }
    }
  3. Платежная система (Payment) — абстрактный класс с методом processPayment(). Дочерние классы могут представлять разные платежные системы: CreditCardPayment, PaypalPayment, которые реализуют метод по-своему.

    abstract class Payment {
      void processPayment();
    }
    
    class CreditCardPayment extends Payment {
      @override
      void processPayment() {
        print('Оплата кредитной картой');
      }
    }
    
    class PaypalPayment extends Payment {
      @override
      void processPayment() {
        print('Оплата через PayPal');
      }
    }
  4. Документ (Document) — у каждого документа есть метод printDocument(), который будет разным для PDF и Word документов.

    abstract class Document {
      void printDocument();
    }
    
    class PdfDocument extends Document {
      @override
      void printDocument() {
        print('Печать PDF-документа');
      }
    }
    
    class WordDocument extends Document {
      @override
      void printDocument() {
        print('Печать Word-документа');
      }
    }
  5. Животное (Animal) — как в примере выше, есть абстрактный класс Animal с абстрактным методом makeSound().

Итоги

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

Пример:

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

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

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

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

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

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

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

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

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

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: NotificationScreen(),
    );
  }
}

// Абстрактный класс Notification, который задает структуру уведомлений
abstract class Notification {
  String title; // Заголовок уведомления
  DateTime time; // Время уведомления

  Notification(this.title, this.time);

  // Абстрактный метод для показа уведомления
  void showNotification();
}

// Класс уведомления о сообщении
class MessageNotification extends Notification {
  String message;

  MessageNotification(String title, DateTime time, this.message)
      : super(title, time);

  @override
  void showNotification() {
    print("Новое сообщение: $message");
  }
}

// Класс уведомления о звонке
class CallNotification extends Notification {
  String callerName;

  CallNotification(String title, DateTime time, this.callerName)
      : super(title, time);

  @override
  void showNotification() {
    print("Входящий звонок от: $callerName");
  }
}

// Экран для отображения списка уведомлений
class NotificationScreen extends StatelessWidget {
  // Пример списка уведомлений
  final List<Notification> notifications = [
    MessageNotification("Сообщение", DateTime.now(), "Привет! Как дела?"),
    CallNotification("Звонок", DateTime.now(), "Алексей"),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Уведомления")),
      body: ListView.builder(
        itemCount: notifications.length,
        itemBuilder: (context, index) {
          final notification = notifications[index];
          return ListTile(
            title: Text(notification.title),
            subtitle: Text(notification.time.toString()),
            onTap: () {
              notification.showNotification(); // Вызывает метод showNotification для каждого типа уведомления
            },
          );
        },
      ),
    );
  }
}

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

  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 и вызывать методы поочередно, не задумываясь о том, к какому типу конкретное уведомление относится.

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

Previous07. НаследованиеNext09. Интерфейсы

Last updated 6 months ago

👨‍💻
🧩
🧑‍🏫