首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类应该继承Dart中的私有混合变量吗?

子类应该继承Dart中的私有混合变量吗?
EN

Stack Overflow用户
提问于 2019-09-05 03:42:49
回答 1查看 1.8K关注 0票数 3

我是否应该得到以下错误:

class.dart:11:11: Error: getter '_privateID‘不是为类'Y’定义的。-Y来自‘class.dart. from’.尝试将名称更正为现有getter的名称,或定义名为“_privateID”的getter或字段。

从下面的代码?

mixin.dart

代码语言:javascript
复制
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

代码语言:javascript
复制
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.)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-05 05:56:19

这不是虫子。私有字段是继承的,但您不能访问它,因为它的名称是专用于其他库的。

达特的“隐私”概念是图书馆的私名。_privateID库中的名称mixin.dart引入了一个库私有名称。这个名称是特殊的,因为它只能写在同一个库中。如果有人在不同的库中写入_privateID,则它是一个不同的名称,它是该库唯一的名称。

似乎私有名称包括它所写入的库的库URI,所以您真正声明的是一个名称_privateID@mixin.dart。当您试图在class.dart中读取该字段时,您可以编写._privateID,但是因为它位于不同的库中,所以您真正编写的是._privateID@class.dart,这是一个完全不同的名称,类没有任何带有该名称的声明。

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

这就是为什么当您在同一个库中编写混音时,代码才能工作。如果您想要将混合文件移动到单独的文件,但不一定是单独的库,则可以使用 file

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57798124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档