【问题标题】:Should subclasses inherit private mixin variables in Dart?子类应该继承 Dart 中的私有 mixin 变量吗?
【发布时间】:2019-09-05 03:42:49
【问题描述】:

我应该得到以下错误:

class.dart:11:11:错误:没有为类“Y”定义吸气剂“_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
}

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.)

【问题讨论】:

    标签: dart mixins


    【解决方案1】:

    这不是错误。 私有字段是继承的,但您无法访问它,因为它的名称对不同的库是私有的。

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

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

    所以,如果一个类需要访问另一个类的私有成员(或 mixin,或任何东西),那么这两个需要在同一个库中声明,否则它们甚至无法写入该变量的名称。

    这就是为什么在同一个库中编写 mixin 时代码可以工作的原因。 如果你想将 mixin 移动到一个单独的文件,但不一定是一个单独的库,你可以使用part file

    【讨论】:

    • 优秀。谢谢!现在进一步试验,我发现在扩展 Mixin 时我也无法访问 _private 将其视为一个类。我应该在发帖之前尝试过。我假设每个文件都是它自己的库,除非另有扩展,无论文件的位置如何?大多数解释都假设您在告诉您如何打包它们之前知道“库”是什么。我想我还在考虑 Java 或 Kotlin。
    • 几乎所有的 Dart 文件都是单独的库。只有图书馆才能拥有imports。例外情况是 part 文件本身不是库,而只是包含在另一个文件的库中。您在库中包含一个带有part "partfile.dart"; 声明的部件,并通过以指向它所属库的part of "thelibrary.dart"; 声明开始它来将部件文件标记为一个。 Dart 语言目前除了库之外没有任何其他的代码组织粒度,尽管工具可能知道 Pub 包。
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2012-06-03
    • 2011-03-23
    • 2018-09-19
    • 2012-05-16
    • 2014-04-06
    相关资源
    最近更新 更多