Menu
Coddy logo textTech

Члены экземпляра и статические члены

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

В классах Dart members (переменные и методы) могут принадлежать либо отдельным объектам, либо самому классу. Понимание этого различия имеет фундаментальное значение для эффективной организации кода.

Члены Instance принадлежат каждому созданному тобой объекту. Каждый объект получает собственную копию переменных экземпляра, а методы экземпляра работают с данными этого конкретного объекта:

class Dog {
  String name;  // Переменная экземпляра
  
  Dog(this.name);
  
  void bark() {  // Метод экземпляра
    print('$name says woof!');
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

dog1.bark();  // Buddy говорит гав!
dog2.bark();  // Max говорит гав!

Каждый объект Dog имеет собственное имя name. Изменение имени одной собаки не влияет на другую.

Статические members принадлежат самому class, а не какому-либо конкретному объекту. Они общие для всех Instance и доступны с использованием имени class:

class Dog {
  String name;
  static int totalDogs = 0;  // Статическая переменная
  
  Dog(this.name) {
    totalDogs++;
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

print(Dog.totalDogs);  // 2

Переменная totalDogs является общей — существует только одна её копия независимо от количества объектов Dog. Вы обращаетесь к ней через имя класса Dog.totalDogs, а не через экземпляр.

challenge icon

Задание

Легко

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

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

  • exhibit.dart: Определите класс Exhibit, представляющий музейный экспонат. Каждый экспонат должен иметь:
    • Переменную экземпляра name (String) для имени экспоната
    • Переменную экземпляра visitorCount (int), начинающуюся с 0, для отслеживания количества посетителей этого конкретного экспоната
    • Статическую переменную totalVisitors (int), начинающуюся с 0, для отслеживания общего количества посещений всех экспонатов
    • Конструктор, принимающий имя экспоната
    • method recordVisit(), который увеличивает как visitorCount экспоната, так и totalVisitors класса
    • method displayStats(), который выводит информацию об экспонате
  • main.dart: Импортируйте свой класс экспоната и создайте два экспоната:
    • Экспонат 'Dinosaur Bones'
    • Экспонат 'Ancient Egypt'
    Зафиксируйте 3 посещения экспоната Dinosaur Bones, затем зафиксируйте 2 посещения экспоната Ancient Egypt. После всех посещений вызовите displayStats() для каждого экспоната в порядке их создания, затем выведите общее количество посетителей всех экспонатов.

method displayStats() должен выводить данные в точно таком формате:

[name]: [visitorCount] visitors

Для строки с общим количеством посетителей выведите:

Total museum visitors: [totalVisitors]

Обратитесь к статической переменной, используя имя класса Exhibit.totalVisitors.

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

Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5

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

import 'exhibit.dart';

void main() {
  // TODO: Create a 'Dinosaur Bones' exhibit
  
  // TODO: Create an 'Ancient Egypt' exhibit
  
  // TODO: Record 3 visits to the Dinosaur Bones exhibit
  
  // TODO: Record 2 visits to the Ancient Egypt exhibit
  
  // TODO: Вызовите displayStats() для каждого экспоната по порядку
  
  // TODO: Print total museum visitors using Exhibit.totalVisitors
  // Format: Total museum visitors: [totalVisitors]
}
quiz iconПроверьте себя

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

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

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