2017-07-21 1 views
0

Ich habe eine abstrakte Oberklasse mit einer Vielzahl von statuslosen Implementierungen. Es scheint so, als ob die abstrakte Superklasse eine class ist, und jede Implementierung zu einer object machen soll, weil ich nur eine davon benötige.Wie kann ich ein scala "Objekt" zurückgeben, als wäre es eine Klasseninstanz?

Dies ist ein Spielzeug Beispiel, aber es zeigt die Compiler-Fehler Ich erhalte:

// Tramsformer.scala 

class Transformer { 
    def transform(value : String) : String 
} 

object Transformer { 
    getTransformer(String : name) : Transformer = { 
    name match { 
     case "upper" => UpperTransformer 
         // I'm getting "Cannot Resolve Symbol" on UpperTransformer, 
         // even though they're in the same package. 
     case _ => throw new IllegalArgumentException("...") 
    } 
    } 
} 

// --- 
// UpperTransformer.scala is in the same package 
object UpperTransformer extends Transformer { 
    override def transform(vlaue : String) = foo.toUpperCase() 
} 

ich wirklich bin hier für eine Art von dynamischer Dispatch auf (Datenprovider, desiredAction) zu schießen.

Dann kann eine Klasse Transformer.getTransformer("upper").transform("stack-overflow") aufrufen, ohne unnötige Objekte zu erstellen.

Irgendeine Idee, was ich anders machen sollte? Sollte ich aufhören, mich über vorzeitige Optimierung Gedanken zu machen und die Instanz lieben lernen?

Antwort

2

Das Problem ist nicht Sichtbarkeit, es ist, dass Sie einfach kein Objekt namens UpperTransformer irgendwo definieren - nur eine Klasse. Wenn Sie class UpperTransformer durch object UpperTransformer ersetzen, sollte Ihr Code gut funktionieren.

+0

Whoops, Tippfehler in meiner Frage. Es ist schon ein 'Objekt'. –

+0

@EdBrannin Nun, nachdem Sie alle anderen Tippfehler korrigiert haben (fehlende 'abstract' für die Transformer-Klasse,' value' vs. 'foo',' String: name'), funktioniert der von Ihnen gepostete Code gut mit 'object' anstelle von' Klasse ". Sie sollten also überdenken, was Ihr tatsächliches Problem ist (und sicherstellen, dass Ihr reproduzierbares kompilierbares Codebeispiel Ihr Problem in der Zukunft kompiliert und reproduziert). – sepp2k

+0

Darn, tut mir leid. Ich werde es neu machen, indem ich den bestehenden Code später noch einmal redigiere. –

Verwandte Themen