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



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

class MyClass1 {
double _myprivatevar;
}
class MyClass2 extends MyClass1 {
MyClass2(double myvar){
this._myprivatevar = myvar;
}
}  

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

import 'package:test/myclass1.dart';
class MyClass2 extends MyClass1 {
MyClass2 (double myvar){
this._myprivatevar = myvar;
}
}

我有一个错误说:

没有为类"MyClass2"定义setter"_myprivatevar"。尝试导入定义"_myprivatevar"的库,更正name到现有setter的名称,或定义setter或字段命名为'_myprivatevar'.dart(undefined_setter(

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

您不能直接从不同的库访问私有名称,并且Dart没有任何与"protected"(从子类访问(相对应的隐私表示法。

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

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

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

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

您可以为此使用@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;
}
}  

源代码和Github问题链接

您可以使用part/ part of

// lib.dart
library lib
part 'class1.dart'
part 'class2.dart'
// class1.dart
part of lib
// class2.dart
part of lib

最新更新