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?
Whoops, Tippfehler in meiner Frage. Es ist schon ein 'Objekt'. –
@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
Darn, tut mir leid. Ich werde es neu machen, indem ich den bestehenden Code später noch einmal redigiere. –