Назад к вопросам
Junior
110
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Dart область видимости (scope) определяется следующими механизмами:

  • Область видимости на уровне файла (Library-level scope): Переменные, функции и классы, объявленные на верхнем уровне файла (не внутри класса или функции), видны во всем этом файле.
  • Область видимости приватности (Private members): Члены класса (переменные, методы, геттеры, сеттеры), имена которых начинаются с символа подчеркивания (_), являются приватными в пределах файла (библиотеки), в котором они объявлены. Доступ к ним возможен только из этого же файла.
  • Область видимости на уровне класса (Class-level scope): Члены класса (переменные, методы и т.д.), не приватные, видны в пределах этого класса и во всех местах, где доступен экземпляр этого класса.
  • Область видимости на уровне функционального блока (Function block scope): Переменные, объявленные внутри функции или блока кода (например, if, for, while), видны только внутри этого блока.

Пример приватности:

// file_a.dart

// Доступно только в file_a.dart
int _privateVariable = 10;

class MyClassA {
  // Available only within MyClassA
  int _privateClassVariable = 20;

  void _privateMethod() {
    // Some internal logic
  }

  void publicMethod() {
    print(_privateClassVariable); // OK
    _privateMethod(); // OK
  }
}

// file_b.dart
import 'file_a.dart';

void main() {
  // print(_privateVariable); // Error: Undefined name '_privateVariable'

  var myObject = MyClassA();
  // print(myObject._privateClassVariable); // Error: The getter '_privateClassVariable' isn't defined for the type 'MyClassA'.
  // myObject._privateMethod(); // Error: The method '_privateMethod' isn't defined for the type 'MyClassA'.
  myObject.publicMethod(); // OK
}