2017-07-06 7 views
1

Ich möchte an diese Klassen statische Dienstprogramme anhängen, die ein Merkmal namens Application erweitern.scala: Importfunktionen innerhalb der impliziten Klasse definiert

trait Application { 
    def name: String 
} 

case class TestApp(name: String) extends Application 


object ImplicitConf { 
    implicit class AppConfig[T <: Application](val app: T) { 

    lazy val conf = loadConfig 

    def loadConfig = { 
     ConfigFactory.load(app.name) 
    } 

    def getString(path: String): String = conf.getString(path) 
    } 
} 

nun folgende funktioniert:

import Application, TestApp 
import ImplicitConf._ 
import AppUtil._ 

object TestAppConf extends App { 

    val app: Application = TestApp("TestAppConf") 
    val test = app.getString("hello") 
    println(s"The Config value is $test") 

} 

Aber ich bin zu gierig, wie verdeckte ich den Anruf

val test = app.getString("hello") 

In

val test = getString("hello") 
+1

Sie können alles aus der App importieren. import app._ – Ivan

+0

Entschuldigung, der Kommentar ist nicht relevant für implizit – Ivan

Antwort

0

Sie können explizit Konvertiere die App: Anwendung in appWithConf ig: AppConfig und importieren alle Methoden der appWithConfig: AppConfig

val appWithConfig = new AppConfig(app) 
    import appWithConfig._ 
+0

danke für die Antwort. Wie ich bereits im Beitrag erwähnt habe, möchte ich mein Anwendungsmerkmal erweitern, indem ich ihm statische Dienstprogramme unter Verwendung impliziter Klassen hinzufüge. Dies ist keine relevante Lösung für meine spezifische Anforderung, insbesondere wenn ich nicht möchte, dass mehrere Instanzen von Konfigurationsobjekten herumstehen. – sgireddy

+0

Folgendes funktioniert auch, aber der Compiler lässt mich das This-Schlüsselwort nicht weglassen. \t \t Objekt TestAppConf erweitert App mit Application { \t Überschreibung val name = "TestAppConf" \t val test = this.getString ("Hallo") \t println (s "Der Wert Config ist $ test") \t} – sgireddy

0

Die beste Option, die ich hatte, war die Methoden in der übergeordneten Objekt zu verweisen:

object ImplicitConf { 

    def getString[T <: Application](str: String)(implicit app: T) = AppConfig(app).getString(str) 

    implicit class AppConfig[T <: Application](val app: T) { 

    @transient lazy val conf = loadConfig 


    def loadConfig = { 
     ConfigFactory.load(app.name) 
    } 

    def getString(path: String): String = conf.getString(path) 

    } 
} 

Dann konnte ich, wie unten aufzurufen:

object TestAppConf extends App { 

    implicit val app: Application = TestApp("TestAppConf") 

    val test = getString("hello") 

    println(s"The Config value is $test") 

} 
Verwandte Themen