erstellen Sie eine neue Instanz eines Typs in scala
Wenn ich eine C-Klasse-definiert als
class C[A]
gibt es eine Möglichkeit zum erstellen einer neuen Instanz von A
in C? So etwas wie
class C[A] {
def f(): A = new A()
}
Ich verstehe, dass, wenn dieses möglich wäre, würde Sie wahrscheinlich angeben, die als argument für den Konstruktor irgendwo, und das ist in Ordnung.
Wenn es nicht möglich ist, gibt es Entwurfsmuster für den Umgang mit der Art von situation, wo Sie möchten, erstellen Sie eine neue Instanz eines Typs?
- Und was schlagen Sie vor, passiert, wenn der konkrete Typ nicht über einen (parameterlosen) construcutor?
- Im Idealfall könnten Sie diese in den Typ-parameter. So könnte ich definieren C wie
class C[A(String, String)]
oder so etwas. Dann würd ich anrufen Einer mit zwei String-Argumente. - Gilt, dass Scala?
- Nein, aber
class C[(String, String), A]
wäre. Es ist ziemlich einfach zu erweitern mein Ansatz unten, um einige (oder alle) der Konstruktor-Argumente in dermake
Methode durch die Verwendung von einem zweiten Typ-parameter. - Aber trotzdem, eine definition von C würde nur Arbeit für einen bestimmten Konstruktor Signatur. Das war mein Punkt.
- Nicht so.
class C[Args, T](implicit e: Makeable[Args, T]) { ... }
. Jeder Makeable Instanz würde nur destructure Args geben, wie nötig, um den richtigen Konstruktor aufzurufen. - Ja, dein "hack" funktioniert. Ich war in Bezug auf die ursprüngliche Frage. Das ist, warum ich kommentierte hier und nicht auf Ihre Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie ein-Typ-Klasse, die abstrakte Instantiierung:
Beispielsweise
Beim instanziieren C, müssen Sie zur Verfügung stellen, explizit oder implizit, ein Makeable, der als ein Werk des entsprechenden Typs. Die Fabrik, natürlich, wäre verantwortlich für die Bereitstellung der Konstruktor Argumente, wenn es ruft den Konstruktor.
Alternativ könnten Sie ein Manifest, aber seien Sie gewarnt, dass dieser Ansatz beruht auf der Reflexion und ist nicht typsicher:
Für die Vollständigkeit, können Sie auch einfach erweitern diesen Ansatz um einige oder alle der Konstruktor-Parameter in der Methode machen:
Können Sie verlangen, einen impliziten parameter, etwa so:
Alles, was Sie brauchen, dann ist eine implizite Fabrik der gewünschte Typ in Reichweite, wenn Sie instantiieren
A
z.B. die folgenden Werke:Gezeigt:
Gleich wie @Raphael die Antwort mit einem Fall Klasse
apply
Methode: