我应该得到以下错误:
class.dart:11:11:错误:没有为类“Y”定义 getter“_privateID”。-“Y”来自“class.dart”。尝试将名称更正为现有 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
}
Run Code Online (Sandbox Code Playgroud)
类.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();
}
Run Code Online (Sandbox Code Playgroud)
或者这是一个错误?如果这不是一个错误,我想了解为什么这种行为是合理的。
当我在与上述类相同的文件中定义 mixin 时,我没有收到任何错误。
(Dart SDK 2.4.1。)
这不是一个错误。私有字段是继承的,但您无法访问它,因为它的名称对于其他库来说是私有的。
Dart 的“隐私”概念是库私有名称。_privateID库中的名称mixin.dart引入了库私有名称。这个名字的特殊之处在于它只能写在同一个库内。如果有人_privateID在不同的库中编写,则它是一个不同的名称,而是该库所独有的名称。
这就好像私有名称包含了它所写入的库的库 URI,所以您真正声明的是一个 name _privateID@mixin.dart。当您尝试读取 中的该字段时class.dart,您会编写._privateID,但因为它位于不同的库中,所以您真正编写的是._privateID@class.dart,一个完全不同的名称,并且类没有任何使用该名称的声明。
因此,如果一个类需要访问另一个类(或 mixin 或其他任何东西)的私有成员,那么这两个类需要在同一个库中声明,否则它们甚至无法写入该变量的名称。
这就是为什么如果您在同一个库中编写 mixin 则代码可以工作的原因。如果您想将 mixin 移至单独的文件,但不一定是单独的库,则可以使用partfile。
| 归档时间: |
|
| 查看次数: |
2417 次 |
| 最近记录: |