diese einfache Klasse vor:Wie kann ich eine anonyme Instanz eines generischen Typs erstellen?
class MyClass(p: (String, String) *) {
val params: Map[String, String] = p.toMap
}
Und eine Klasse, die es erweitert:
class SomeOtherClass(p: (String, String) *) extends MyClass(p: _*)
Ich möchte entfernen Sie den Konstruktor von MyClass
zu vermeiden Tragen um den Initialisierungsparameter in allem, was sie erstreckt (potenziell viele Arten). Stattdessen würde ich bevorzugen, dass die Companion-Objekte der Typen, die MyClass
erweitern, eine Art Builder-Methode erben.
class MyClass {
val param = Map.empty[String, String] // some member with a default value
}
trait MyClassBuilder[A <: MyClass] {
def apply(p: (String, String) *): A = ???
}
Grundsätzlich apply
sollte so etwas tun:
new A {
override val param = p.toMap
}
Offensichtlich ist die obige Code nicht funktionieren kann. Die Idee ist, dass ein Untertyp wie folgt verwendet werden würde:
class SomeOtherClass extends MyClass
object SomeOtherClass extends MyClassBuilder[SomeOtherClass] {
// object specific things..
}
Dann SomeOtherClass
würde verlassen sich auf die ererbten apply
Methode für Instanzen von sich selbst zu schaffen. Es scheint so etwas mit Reflektion oder Makros möglich zu sein, aber ich habe wirklich keine Ahnung. Um klar zu sein, möchte ich, dass Client-Code wie SomeOtherClass
keinen Konstruktor benötigt, weshalb ich das Erstellen von anonymen Klassen für einen generischen Typ untersuchen möchte. Es könnte nicht SomeOtherClass
sein, das generiert wird, es könnte alles sein, was MyClass
erweitert.
Ich wette, ein Makro ist die Weg zu gehen hier, die würde die Boilerplate produzieren, die Sie versuchen zu vermeiden –