子类应该继承 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 移动到一个单独的文件,但不一定是一个单独的库,你可以使用 .
我应该得到以下错误:
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 移动到一个单独的文件,但不一定是一个单独的库,你可以使用