Ich hätte gern ein versiegeltes Merkmal, das eine deklarierte Methode hat, die das zurückgibt tatsächliche Klasse, die das Merkmal erweitert. Sollte ich einen abstrakten Typ, einen Parametertyp oder verwenden Gibt es noch eine andere Möglichkeit, dies zu lösen?
%Vor%oder
%Vor% Beachten Sie, dass T
in diesem Beispiel ein Untertyp von Foo
sein muss. Wenn ich es so mache, der Typ
Informationen fühlen sich zu oft wiederholt:
Sie können die Wiederholung ein wenig reduzieren, indem Sie Ihre doit
-Methode eine Factory-Funktion zurückgeben:
Bei einem abstrakten Typ ist das nicht möglich:
%Vor%Sie sind meistens austauschbar. Der Grund war laut Odersky vor allem die Vollständigkeit: Ähnlich wie die Tatsache, dass Methoden und Felder (Werte) entweder abstrakt oder als Parameter übergeben werden können, können auch Typen.
Es ist besser, einen abstrakten Typ zu verwenden, wenn Sie mehrere Eigenschaften kombinieren möchten, die alle denselben Typnamen verwenden. Bei Typparametern müssen Sie den Typ explizit jedem
übergebenHier ist ein Artikel, der all dies erklärt: Ссылка
Dieses Merkmal kann nur gemischt werden, wenn A ein Untertyp von Foo [A] ist und der einzige Typ, der dies erfüllt, ist die Klasse, in die Foo gemischt wird. Ich habe diese Lösung in den Mapper-Merkmalen in Lift gesehen.
BEARBEITEN - Unten ist meine ursprüngliche Antwort. Ihr Kommentar zeigt an, dass Sie eine beliebige Instanz eines passenden Typs zurückgeben möchten, aber ich glaube nicht, dass dies in irgendeiner Weise sinnvoll ist. Angenommen, über die T.type
-Syntax :
Dies ist mit this.type
:
Und dann auch:
%Vor%Tags und Links scala