在 Dart 中,如何从另一个文件中的子类访问父私有变量?

Tho*_*ard 10 privileges private subclass dart

我在 Dart 中有两个类,MyClass1 和 MyClass2,其中 MyClass2 扩展了 MyClass1。在某些 MyClass2 函数中,我想访问在 MyClass1 中具有“私有”访问权限的变量。如果 MyClass1 和 MyClass2 在同一个 dart 文件中声明,如下所示:

class MyClass1 {
  double _myprivatevar;
}

class MyClass2 extends MyClass1 {

  MyClass2(double myvar){
    this._myprivatevar = myvar;
  }
}  
Run Code Online (Sandbox Code Playgroud)

一切都很好但是现在,如果 MyClass2 在它自己的 dart 文件中声明:

import 'package:test/myclass1.dart';

class MyClass2 extends MyClass1 {

  MyClass2 (double myvar){
    this._myprivatevar = myvar;
  }
}
Run Code Online (Sandbox Code Playgroud)

我有一个错误说:

没有为类“MyClass2”定义设置器“_myprivatevar”。尝试导入定义 '_myprivatevar' 的库,将名称更正为现有 setter 的名称,或者定义名为 '_myprivatevar'.dart(undefined_setter) 的 setter 或字段

如何解决这个问题并从另一个 dart 文件中定义的子类访问父私有变量?

lrn*_*lrn 6

您无法直接从不同的库访问私有名称,并且 Dart 没有任何与“受保护”(从子类访问)相对应的隐私符号。

您必须将属性公开,在同一个库中声明两个类,或者不从子类访问该属性。没有其他选择。

如果您唯一的问题是初始化实例变量,那么您也许可以将该变量的值作为构造函数参数传递给超类,从而让超类为您访问该变量:

class MyClass1 {
  double _myPrivateVar;
  MyClass1([double myPrivateValue]) : _myPrivateVar = myPrivateValue;
}
// In different library:
class MyClass2 extends MyClass1 {
  MyClass2(double myVar) : super(myVar);
}
Run Code Online (Sandbox Code Playgroud)

这不会帮助您稍后读取私有变量,它仍然只有超类和同一库中的其他代码可以访问该变量。


小智 6

您可以为此使用@protected 注释。

class MyClass1 {
  double _myprivatevar;

  @protected double get myprivatevar => _myprivatevar;

  @protected set myprivatevar(newValue) {
    _myprivatevar = newValue;
  }
    
}

class MyClass2 extends MyClass1 {

  MyClass2(double myvar){
    myprivatevar = myvar;
  }
}  
Run Code Online (Sandbox Code Playgroud)

来源Github 问题链接