子类是否应该在Dart中继承私有的mixin变量?

时间:2019-09-05 03:42:49

标签: dart mixins

我应该出现以下错误:

  

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)

1 个答案:

答案 0 :(得分:1)

这不是错误。 私有字段是继承的,但是您不能访问它,因为它的名称是另一个库的私有字段。

Dart的“隐私”概念是图书馆的私人名称_privateID库中的名称mixin.dart引入了库私有名称。此名称的特殊之处在于,它只能 写入同一库中。 如果有人在不同的库中编写_privateID,则它是一个不同的名称,而不是该库的唯一名称。

就好像私有名称包含要写入的库的库URI,所以您真正声明的是名称_privateID@mixin.dart。 当您尝试在class.dart中读取该字段时,您写的是._privateID,但由于它位于不同的库中,因此您真正写的是._privateID@class.dart,一个完全不同的名称和类没有任何带有那个名称的声明。

因此,如果一个类需要访问另一个类的私有成员(或mixin或其他任何东西),则这两个类需要在同一库中声明,因为否则它们甚至不能 write 该变量的名称。

因此,如果您在同一库中编写mixin,则代码可以工作。 如果要将混入移至单独的文件(但不一定是单独的库),则可以使用part file

相关问题