Члены экземпляра и статические члены
Часть раздела Объектно-ориентированное программирование путешествия по 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, а не через экземпляр.
Задание
ЛегкоДавайте создадим систему подсчёта посетителей для музея, которая отслеживает посещения отдельных экспонатов и общую статистику музея.
Вы организуете код в двух файлах:
exhibit.dart: Определите классExhibit, представляющий музейный экспонат. Каждый экспонат должен иметь:- Переменную экземпляра
name(String) для имени экспоната - Переменную экземпляра
visitorCount(int), начинающуюся с0, для отслеживания количества посетителей этого конкретного экспоната - Статическую переменную
totalVisitors(int), начинающуюся с0, для отслеживания общего количества посещений всех экспонатов - Конструктор, принимающий имя экспоната
- method
recordVisit(), который увеличивает какvisitorCountэкспоната, так иtotalVisitorsкласса - method
displayStats(), который выводит информацию об экспонате
- Переменную экземпляра
main.dart: Импортируйте свой класс экспоната и создайте два экспоната:- Экспонат
'Dinosaur Bones' - Экспонат
'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]
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн РепозиторийПотренируйтесь самостоятельно: Онлайн-компилятор Dart