Vermeiden Sie Code-Duplizierung mit Hilfe der Eingabe in scala

8

Ich schreibe gerade in scala und ich betrachte mich selbst als Neuling. Ich habe 3 Klassen außerhalb meiner Kontrolle, das bedeutet, dass ich sie nicht ändern kann.

%Vor%

Dies ist ein vereinfachtes Beispiel, der tatsächliche Code ist komplizierter und die Klassen A, B haben viele andere ähnliche Methoden.

Ich muss Methode m für Instanzen der Klassen A, B

aufrufen

Die offensichtliche Lösung ist:

%Vor%

aber das beinhaltet Code-Duplizierung. Ich habe versucht, es mit Ente Typisierung zu lösen und bis jetzt meine beste Meinung zu diesem Thema ist dies:

%Vor%

aber ich bekomme Inferenzfehler wie:

%Vor%

Kann dieses Problem auf elegante Weise mit minimaler Magie gelöst werden?

    
fusion 19.08.2015, 18:43
quelle

2 Antworten

11

Sie haben ein paar Optionen. Eine besteht darin, die Typparameter explizit anzugeben:

%Vor%

Wenn die m -Methode immer einen Wert des Typs zurückgibt, für den sie definiert wurde, können Sie die Typinferenz durch Kodieren dieser Tatsache in Ihrem fill :

aushelfen %Vor%

Sie können auch den Typalias überspringen:

%Vor%

Ich würde jedoch sehr empfehlen, eine Typklasse zu verwenden - es ist ein bisschen syntaktischer Overhead, aber viel sauberer:

%Vor%

Und dann:

%Vor%

Kein reflektierender Zugriff und Sie verwenden eine allgemein verständliche Sprache.

    
Travis Brown 19.08.2015, 19:06
quelle
1

Sie können eine Typenklasse verwenden, aber ehrlich gesagt würde ich in diesem Fall nur eine Musterübereinstimmung finden, wenn es wirklich keinen allgemeinen Supertyp von A und B gibt.

%Vor%

Wenn es wirklich nur zwei gibt, dann benutze einfach den Mustervergleich.

    
Ryan 19.08.2015 19:04
quelle

Tags und Links