Die Top-Antwort ist ab sofort definitiv richtig.
Ich werde versuchen, in dieser Antwort näher darauf einzugehen.
Ich werde die Frage beantworten, aber damit beginnen: So soll Dart einfach nicht geschrieben werden, auch weil bibliotheksprivate Mitglieder es einfacher machen, Operatoren wie zu definieren ==
. (Private Variablen eines zweiten Objekts konnten für den Vergleich nicht angezeigt werden.)
Nachdem wir das aus dem Weg geräumt haben, zeige ich Ihnen zunächst, wie es gemacht werden soll (bibliotheksprivat statt klassenprivat), und zeige Ihnen dann, wie Sie eine Variable klassenprivat machen, wenn das willst du immer noch wirklich. Auf geht's.
Wenn eine Klasse keine geschäftlichen Variablen in einer anderen Klasse sieht, fragen Sie sich möglicherweise, ob sie wirklich zur selben Bibliothek gehören:
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);
}
Das sollte gut sein. Wenn Sie jedoch wirklich private Klassendaten möchten:
Obwohl Sie technisch private Variablen zu erstellen ist nicht erlaubt, Sie könnten es emulieren die folgende Verschlusstechnik.
(Sie sollten jedoch sorgfältig überlegen, ob Sie es wirklich brauchen und ob es einen besseren, dartartigeren Weg gibt, um das zu tun, was Sie erreichen wollen!)
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());
}
Also ja. Seien Sie vorsichtig und versuchen Sie, die Best Practices der Sprache zu befolgen. Es sollte Ihnen gut gehen.
BEARBEITEN
Anscheinend gibt es eine neue typedef-Syntax, die für Dart 2 bevorzugt wird. Wenn Sie Dart 2 verwenden, sollten Sie diese verwenden. Oder, noch besser, verwenden Sie Inline-Funktionstypen.
Wenn Sie die zweite verwenden, ist sie weniger ausführlich, aber die anderen Probleme bleiben bestehen.