Erweiterung eines Merkmals und von Typen

8

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:

%Vor%     
chrsan 29.11.2010, 11:01
quelle

5 Antworten

2

Sie können die Wiederholung ein wenig reduzieren, indem Sie Ihre doit -Methode eine Factory-Funktion zurückgeben:

%Vor%

Bei einem abstrakten Typ ist das nicht möglich:

%Vor%     
Aaron Novstrup 29.11.2010, 22:50
quelle
4

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

übergeben

Hier ist ein Artikel, der all dies erklärt: Ссылка

    
IttayD 29.11.2010 11:34
quelle
2

Sie können schreiben:

%Vor%

Der Unterschied zu Ihrem Beispiel ist, dass Bar nicht auf andere Weise instanziiert werden kann (z. B. case class Bar(name: String) extends Foo[String] ).

    
Landei 29.11.2010 14:49
quelle
1
%Vor%

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.

    
Kim Stebel 29.11.2010 12:12
quelle
1

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 :

%Vor%

Dies ist mit this.type :

möglich %Vor%

Und dann auch:

%Vor%     
oxbow_lakes 29.11.2010 11:30
quelle

Tags und Links