Menu
Coddy logo textTech

Переопределение методов

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy. Урок 38 из 110.

Переопределение method происходит, когда дочерний class предоставляет собственную реализацию method, который уже существует в parent class. Это позволяет подклассам настраивать унаследованное поведение, сохраняя ту же сигнатуру method.

Когда вы определяете метод в дочернем классе с тем же именем и параметрами, что и метод в родительском классе, версия дочернего класса берет верх:

class Animal {
  String name;
  
  Animal(this.name);
  
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void speak() {
    print('$name barks: Woof!');
  }
}

void main() {
  var animal = Animal('Generic');
  var dog = Dog('Buddy');
  
  animal.speak();  // Generic издаёт звук
  dog.speak();     // Buddy лает: Woof!
}

Когда вы вызываете speak() для экземпляра Dog, Dart выполняет версию Dog, а не Animal. Дочерний класс переопределил метод parent.

Вы можете also объединить переопределение с super, чтобы расширить, а не заменить поведение parent:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speak() {
    super.speak();  // Сначала вызвать версию родителя
    print('$name also purrs');
  }
}

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

challenge icon

Задание

Легко

Давайте создадим систему уведомлений, которая демонстрирует, как дочерние class могут переопределять методы parent для настройки поведения. Вы создадите разные типы уведомлений, каждый из которых доставляет сообщения своим уникальным способом.

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

  • notification.dart: здесь Define иерархию уведомлений:
    • class Notification (parent) с полями String title и String message. Добавьте constructor, принимающий оба значения, и method send(), который выводит Notification: [title] - [message]
    • class EmailNotification, который extends Notification и добавляет свойство String recipient. Переопределите method send(), чтобы он выводил Sending email to [recipient]: [title] - [message]
    • class PushNotification, который extends Notification и добавляет свойство String deviceId. Переопределите method send(), чтобы сначала вызвать send() parent с помощью super, а затем вывести Pushed to device: [deviceId] на следующей строке
  • main.dart: импортируйте файл с уведомлениями и продемонстрируйте переопределение method в действии:
    • Create базовый Notification с заголовком 'Alert' и сообщением 'System update available'
    • Call его method send()
    • Выведите пустую строку
    • Create EmailNotification с заголовком 'Welcome', сообщением 'Thanks for signing up!' и recipient 'user@example.com'
    • Call его method send()
    • Выведите пустую строку
    • Create PushNotification с заголовком 'Reminder', сообщением 'Meeting in 10 minutes' и deviceId 'DEVICE-001'
    • Call его method send()

Обратите внимание, как EmailNotification полностью заменяет поведение parent, тогда как PushNotification расширяет его, сначала вызывая super.send(). Оба подхода являются допустимыми способами переопределения методов в зависимости от ваших потребностей.

Ожидаемый результат:

Notification: Alert - System update available

Sending email to user@example.com: Welcome - Thanks for signing up!

Notification: Reminder - Meeting in 10 minutes
Pushed to device: DEVICE-001

Попробуйте сами

import 'notification.dart';

void main() {
  // TODO: Create a base Notification with title 'Alert' and message 'System update available'
  // Вызовите его метод send()

  // TODO: Выведите пустую строку

  // TODO: Создайте EmailNotification с:
  // - title: 'Welcome'
  // - message: 'Thanks for signing up!'
  // - recipient: 'user@example.com'
  // Вызовите его метод send()

  // TODO: Выведите пустую строку

  // TODO: Создайте PushNotification с:
  // - title: 'Reminder'
  // - message: 'Meeting in 10 minutes'
  // - deviceId: 'DEVICE-001'
  // Вызовите его метод send()
}
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Dart