Видимость приватных переменных во Flutter

ВАЖНО! видимость приватной переменной другая (нежели чем в других языках: php, c++, java.

В dart к приватной переменной можно обратиться и из другого класса, важно, чтобы обращение было в рамках одного файла! Т.е. видимость приватного объекта ограничивается не текущим классом, а текущим файлом!

А вот к приватной переменной, которая расположена в другом файле – обратиться нельзя!

Пример.


//импортируемый файл libraray.dart
class A {
  int _private = 0;
  int public = 0;

  testA() {
    print('int value: $_private');  // 0
    _private = 5;
    print('int value: $_private'); // 5
  }
}

///////////////////////////////////

//исполняемый файл
import 'libraray.dart';

void main() {
  A().public; // Объект public класса А доступен!
  //A()._private; //Объект _private класса А не доступен! (он в другом файле)
  C()._private; // доступен, т.к. в текущем файле
  print('String value: ${B()._private}'); // HelloB.  Доступен private метод класса В! (он в текущем файле)
  B().testB();
}

class B extends A {
  String _private = 'HelloB';

  void testB() {
    print('String value: $_private'); // HelloB
    testA();
    print('String value: $_private'); // HelloB
  }
}

class C {
  String _private = 'HelloC';
}

P.S.

Я хотел найти этому (что видимость приватного объекта в рамках одного файла) подтверждение в официальной документации, и там нашел следующее:

Unlike Java, Dart doesn’t have the keywords public, protected, and private. If an identifier starts with an underscore (_), it’s private to its library. For details, see Libraries and visibility. Every Dart app is a library, even if it doesn’t use a library directive.

В отличие от Java, в Dart нет “ключевых слов” public, protected и private. Если идентификатор начинается с подчеркивания (_), он является приватным для своей библиотеки. Каждое приложение Dart – это библиотека, даже если оно не использует директиву библиотеки.

Насколько я понял, в данном случае под библиотекой как раз и подразумевается файл с нашим кодом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *