In Scala definieren Sie einen lokalen Parameter im primären Konstruktor einer Klasse.

8

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?

%Vor%

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:

%Vor%

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:

%Vor%

Das Hinzufügen von override hilft auch nicht:

%Vor%

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 ?

definiert ist?     
Derek Mahar 11.12.2009, 17:09
quelle

4 Antworten

16

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:

%Vor%     
Randall Schulz 11.12.2009, 17:44
quelle
4

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:

%Vor%

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 Mahar 11.12.2009 17:44
quelle
4

Sie können temporäre Variablen während der Initialisierung einzelner Klassenmitglieder wie folgt erstellen:

%Vor%     
ziggystar 14.12.2009 09:00
quelle
3

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.

    
Randall Schulz 11.12.2009 18:29
quelle

Tags und Links