Wie definiert man in Scala einen lokalen Parameter im primären Konstruktor einer Klasse, die kein Datenelement ist und beispielsweise nur dazu dient, ein Datenelement in der Basisklasse zu initialisieren?
Wie könnte ich beispielsweise im folgenden Code den Parameter b
im primären Konstruktor der Klasse B
korrekt definieren, so dass er nur einen temporären lokalen Parameter und nicht ein Datenelement generiert?
Randall, deine Antworten erklären, warum der Scala-Compiler sich beschwert, wenn ich eine Methode inc
einfüge, die die Eigenschaft a
inkrementiert, aber auch den Namen des Parameters in der Klasse B
-Konstruktor so ändert, dass er dem des Parameters entspricht in der Klasse A
Konstruktor:
Scala-Compiler-Ausgabe:
%Vor% Scala beklagt sich, weil die Klasse B
jetzt eine private, schreibgeschützte Eigenschaft a
haben muss, die auf den Verweis auf a
in inc
zurückzuführen ist. Wenn B(a: Int)
in B(var a: Int)
geändert wird, wird ein anderer Compilerfehler erzeugt:
Das Hinzufügen von override
hilft auch nicht:
Wie kann ich denselben Namen im Parameter im primären Konstruktor von B
als die Eigenschaft verwenden, die im primären Konstruktor der Basisklasse A
?
Wenn Sie das Schlüsselwort "var" oder "val" aus dem Konstruktorparameter entfernen, wird keine Eigenschaft erzeugt.
Beachten Sie jedoch, dass Nicht-Var- und Nicht-Val-Konstruktorparameter innerhalb der Klasse verfügbar und zugänglich sind. Wenn Sie einen in Nicht-Konstruktor-Code verwenden (dh im Hauptteil einer Methode), wird in der generierten Klasse ein unsichtbares privates Feld enthalten sein, das diesen Konstruktor-Parameter enthält, genauso, als ob Sie ihn zu einer "privaten Variablen" oder "privaten Variablen" gemacht hätten. private val "Konstruktor Parameter.
Addendum (besser spät als nie ??):
In diesem Code treten die Verweise auf den Konstruktorparameter nur im Konstruktorhauptteil auf:
%Vor% ... Hier existiert der Wert i
nur während der Ausführung des Konstruktors.
Im folgenden Code muss jedoch der Konstruktorparameter in ein (privates) Feld der generierten Klasse kopiert werden, da der Konstruktorparameter in einem Methodenkörper referenziert wird, der nicht Teil des Konstruktorhauptteils ist (wodurch sein Arbeitsspeicher vergrößert wird) Anforderung durch die 4 Bytes, die benötigt werden, um Int
) zu halten:
Nach einigen Experimenten habe ich festgestellt, dass das Verlassen von var
oder val
vor dem Parameter b
es zu einem lokalen Parameter und nicht zu einem Datenelement macht:
Java-Erweiterung:
%Vor% Beachten Sie, dass die Klasse A
aufgrund des a
in ihrem primären Konstruktor ein privates Datenelement var a: Int
hat. Die Klasse B
hat jedoch keine Datenelemente, aber ihr primärer Konstruktor hat immer noch einen einzelnen Ganzzahlparameter.
Derek,
Wenn Sie Folgendes haben:
%Vor%Sie finden (z. B. mit javap), dass ein Feld mit dem Namen "a" in der Klasse vorhanden ist. Wenn Sie das "def m" auskommentieren, sehen Sie, dass das Feld nicht erstellt wurde.
Tags und Links scala constructor