到目前为止,最重要的答案肯定是正确的。
我将尝试在此答案中更详细地说明。
我将回答这个问题,但首先提出:这不是Dart的编写意图,部分原因是私有库成员使像这样的定义运算符更加容易==
。(无法看到第二个对象的私有变量进行比较。)
现在我们已经解决了这个问题,我将首先向您展示它是如何完成的(库私有而不是class-private),然后向您展示如何使变量成为class-private(如果有)。你仍然真的想要那个。开始了。
如果一个类没有业务看到另一个类上的变量,则您可能会问自己,它们是否真正属于同一库:
class MyClass {
int _val = 0;
int get val => _val;
set val(int v) => _val = (v < 0) ? _val : v;
MyClass.fromVal(int val) : _val = val;
}
void main() {
MyClass mc = MyClass.fromVal(1);
mc.val = -1;
print(mc.val);
mc._val = 6;
print(mc.val);
}
那应该很好。但是,如果您确实想要私有类数据:
尽管从技术上讲不允许您创建私有变量,但是您可以使用以下闭包技术对其进行仿真。
(但是,您应该仔细考虑您是否真的需要它,以及是否有更好的,更像Dart的方式来完成您要完成的工作!)
typedef int IntGetter();
typedef void IntSetter(int value);
class MyClass {
IntGetter getVal;
IntSetter setVal;
MyClass.base() {
int _val = 0;
getVal = ()=>_val;
setVal = (int v) => _val = (v < 0) ? _val : v;
}
factory MyClass.fromVal(int val) {
MyClass result = MyClass.base();
result.setVal(val);
return result;
}
}
void main() {
MyClass mc = MyClass.fromVal(1);
mc.setVal(-1);
print(mc.getVal());
}
嗯是的。只要小心并尝试遵循该语言的最佳实践,就可以了。
编辑
显然,有一种新的typedef语法是Dart 2首选的。如果您使用的是Dart 2,则应该使用它。或者,甚至更好地使用内联函数类型。
如果使用第二个,它的详细程度会降低,但其他问题仍然存在。