我应该出现以下错误:
class.dart:11:11:错误:未为类“ Y”定义吸气剂“ _privateID”。 -“ Y”来自“ class.dart”。 尝试将名称更正为现有吸气剂的名称,或者定义一个名为“ _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)
答案 0 :(得分:1)
这不是错误。 私有字段是继承的,但是您不能访问它,因为它的名称是另一个库的私有字段。
Dart的“隐私”概念是图书馆的私人名称。
_privateID
库中的名称mixin.dart
引入了库私有名称。此名称的特殊之处在于,它只能 写入同一库中。
如果有人在不同的库中编写_privateID
,则它是一个不同的名称,而不是该库的唯一名称。
就好像私有名称包含要写入的库的库URI,所以您真正声明的是名称_privateID@mixin.dart
。
当您尝试在class.dart
中读取该字段时,您写的是._privateID
,但由于它位于不同的库中,因此您真正写的是._privateID@class.dart
,一个完全不同的名称和类没有任何带有那个名称的声明。
因此,如果一个类需要访问另一个类的私有成员(或mixin或其他任何东西),则这两个类需要在同一库中声明,因为否则它们甚至不能 write 该变量的名称。
因此,如果您在同一库中编写mixin,则代码可以工作。
如果要将混入移至单独的文件(但不一定是单独的库),则可以使用part
file。