Ich benutze Scala 2.10.2 und habe zwei Fallklassen, die identische Felder haben:
%Vor%Ich würde gerne so etwas tun:
%Vor% Das kompiliert, aber wenn ich versuche, ein Foo
zu erstellen, bekomme ich:
Funktioniert Typ-Aliasing nicht mit Fallklassen?
Beim Erstellen einer Fallklasse erstellt Scala automatisch ein Begleitobjekt. In Ihrem Code definieren Sie einen Alias für den Typ Thing
, also nur für die Klasse Thing
. Ihr Begleitobjekt Thing
hat immer noch nur 1 Namen und keine Aliase.
Eine Möglichkeit zum "Reparieren" besteht darin, einen Verweis auf das Companion-Objekt (kein Typ-Alias) wie folgt zu erstellen:
%Vor% Eine andere Möglichkeit, das Problem zu beheben, wäre, das importierte Objekt mit import package.{Thing => Bar}
umzubenennen.
Geben Sie Aliase nur Alias den Typ, nicht irgendein Companion-Objekt, das Factory-Methoden liefern könnte (ob Sie diese Factory-Methode selbst schreiben oder eine "kostenlos" vom Compiler erhalten).
Andererseits wirkt sich der Import auf Namen aus, und wenn mehrere Entitäten mit einem bestimmten Namen verknüpft sind, bringt das Importieren dieses Namens jeden Referenten des importierten Namens mit sich. Außerdem können Sie beim Importieren umbenennen und Sie können dies multiplizieren, also ...
%Vor% Es ist jedoch nicht gut für das Rendering über toString
, wie Sie sehen können.
Soll Foo
und Bar
unterscheidbar sein (wie wenn es sich um verschiedene Fallklassen handelt) oder nicht? Wenn ja, und Sie wollen nur vermeiden, Liste der Felder zu wiederholen, können Sie dies tun:
Aber das macht sie offensichtlich etwas unpraktischer in Musterabgleich- oder Zugriffsfeldern. Der Feldzugriff kann ein wenig verbessert werden:
%Vor%Tags und Links scala