Menu
Coddy logo textTech

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

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

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

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

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. Изменение имени одной собаки не влияет на другую.

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

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, для отслеживания общего количества посещений всех экспонатов
    • Конструктор, который принимает название экспоната
    • Метод recordVisit(), который увеличивает как visitorCount экспоната, так и totalVisitors класса
    • Метод displayStats(), который выводит информацию об экспонате
  • main.dart: Импортируйте ваш класс экспоната и создайте два экспоната:
    • Экспонат 'Dinosaur Bones'
    • Экспонат 'Ancient Egypt'
    Запишите 3 посещения экспоната Dinosaur Bones, затем запишите 2 посещения экспоната Ancient Egypt. После всех посещений вызовите displayStats() для каждого экспоната в порядке их создания, а затем выведите общее количество посетителей всех экспонатов.

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

[name]: [visitorCount] visitors

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

Total museum visitors: [totalVisitors]

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

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

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

Шпаргалка

Члены класса в Dart могут быть либо членами экземпляра (принадлежащими отдельным объектам), либо статическими членами (принадлежащими самому классу).

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

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

Статические члены являются общими для всех экземпляров, и доступ к ним осуществляется через имя класса с использованием ключевого слова static:

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

// Доступ к статическим членам через имя класса
print(Dog.totalDogs);  // 2

Статические переменные сохраняют одно общее значение независимо от того, сколько объектов создано.

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

import 'exhibit.dart';

void main() {
  // TODO: Создать экспонат «Кости динозавров»
  
  // TODO: Создать экспонат «Древний Египет»
  
  // TODO: Записать 3 посещения экспоната «Кости динозавров»
  
  // TODO: Записать 2 посещения экспоната «Древний Египет»
  
  // TODO: Вызвать displayStats() для каждого экспоната по порядку
  
  // TODO: Вывести общее количество посетителей музея, используя Exhibit.totalVisitors
  // Формат: Total museum visitors: [totalVisitors]
}
quiz iconПроверьте себя

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

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