我是否应该得到以下错误:
class.dart:11:11: Error: getter '_privateID‘不是为类'Y’定义的。-Y来自‘class.dart. from’.尝试将名称更正为现有getter的名称,或定义名为“_privateID”的getter或字段。
从下面的代码?
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();
}还是这是个窃听器?如果这不是一个bug,我想了解为什么这种行为是合理的。
相反,当我在与上述类相同的文件中定义混音时,就不会出现错误。
(Dart SDK 2.4.1.)
发布于 2019-09-05 05:56:19
这不是虫子。私有字段是继承的,但您不能访问它,因为它的名称是专用于其他库的。
达特的“隐私”概念是图书馆的私名。_privateID库中的名称mixin.dart引入了一个库私有名称。这个名称是特殊的,因为它只能写在同一个库中。如果有人在不同的库中写入_privateID,则它是一个不同的名称,它是该库唯一的名称。
似乎私有名称包括它所写入的库的库URI,所以您真正声明的是一个名称_privateID@mixin.dart。当您试图在class.dart中读取该字段时,您可以编写._privateID,但是因为它位于不同的库中,所以您真正编写的是._privateID@class.dart,这是一个完全不同的名称,类没有任何带有该名称的声明。
因此,如果一个类需要访问另一个类的私有成员(或者混合类或任何东西),那么这两个类都需要在同一个库中声明,因为否则它们甚至无法写入该变量的名称。
这就是为什么当您在同一个库中编写混音时,代码才能工作。如果您想要将混合文件移动到单独的文件,但不一定是单独的库,则可以使用 file。
https://stackoverflow.com/questions/57798124
复制相似问题