子类应该继承 Dart 中的私有 mixin 变量吗?

Should subclasses inherit private mixin variables in Dart?

我应该得到以下错误:

class.dart:11:11: Error: The getter '_privateID' isn't defined for the class 'Y'. - 'Y' is from 'class.dart'. Try correcting the name to the name of an existing getter, or defining a getter or field named '_privateID'.

来自以下代码?

mixin.dart:

class Mixin {
  static int _nextID = 0;

  int publicID = _nextID++; // I only need one of these lines
  int _privateID = _nextID++; // but this variable is inaccessible
}

class.dart:

import 'mixin.dart';

class X with Mixin {
  void run() {
    print(publicID); // no error here
  }
}

class Y with Mixin {
  void run() {
    print(_privateID); // Error: _privateID not defined
  }
}

void main() {
  Y().run();
}

或者这是一个错误?如果这不是错误,我想了解为什么这种行为是合理的。

当我改为在与上述 类 相同的文件中定义 mixin 时,我没有收到任何错误。

(Dart SDK 2.4.1.)

这不是错误。 私有字段是 inherited,但您无法访问它,因为它的名称对不同的库是私有的。

Dart 的 "privacy" 概念是 库私有名称mixin.dart 库中的名称 _privateID 引入了一个库私有名称。这个名字的特殊之处在于它只能写在同一个库中。 如果有人在不同的库中写 _privateID,则它是一个 不同的名称,而是该库唯一的名称。

就好像私有名称包含了它所写的库的库URI,所以你真正声明的是一个名称_privateID@mixin.dart。 当你试图读取 class.dart 中的那个字段时,你会写 ._privateID,但因为它在不同的库中,你真正写的是 ._privateID@class.dart,一个完全不同的名称,并且 classs 没有任何带有 那个 名称的声明。

所以,如果一个 class 需要访问另一个 class 的私有成员(或 mixin,或任何东西),那么这两个需要在同一个库中声明,否则它们甚至不能那个变量的名字。

这就是为什么如果您在同一个库中编写 mixin,代码就可以工作的原因。 如果你想将 mixin 移动到一个单独的文件,但不一定是一个单独的库,你可以使用 .