2017-02-22 5 views
0

Ich habe einen scala-Code aus einer Open-Source-Bibliothek, die wie folgt aussieht: -Scala-überwiegender Variablenwert von Merkmale

//somewhere in the open source code 
trait A 
{ 
val v1=callToSomeFunc() 

def usefulFunc1() {} 
def usefulFunc2() {} 
} 

Required: Ich bin das Merkmal vererben und ich meine Klasse in keinen will Situation, um "callToSomeFunc()" beim Erben des Merkmals A aufzurufen, aber nützlich func1() und nützlichFunc2() des Merkmals A zu verwenden.

Können Sie bitte helfen?

(Für diejenigen von Spark-Hintergrund, ich mehrere sparkcontexts Fehler bin vor, da die Open-Source-Bibliothek, die ich aus bin erben eine sparkcontext definiert, die definitiv nicht etwas, das ich verwenden möchte)

Dank

+0

funktioniert Was hat das mit Apache Spark zu tun? –

+0

@JoeC, bearbeitet die Frage – BigDataScholar

+0

können Sie den Code teilen, der Ihnen Probleme gibt? –

Antwort

1

Sie Verwenden Sie private[this] val v1=callToSomeFunc(), um den Bereich für Ihre v1 auf nur innerhalb des Merkmals einzuschränken. Keine Klasse, die dieses Merkmal erweitert, wird Zugang dazu haben.

+0

Das ist eine OK-Lösung, aber nicht die beste, da ich jetzt den Code aus der Open-Source-Bibliothek bearbeiten muss. – BigDataScholar

+0

Nun, wenn Sie verhindern wollen, dass eine Klasse das Merkmal A erweitert, um die Methode/das Feld des Merkmals aufzurufen, aber das ist nicht Ihre Eigenschaft, können Sie dies nicht erreichen. –

1

Sie können ein von einem Merkmal geerbtes Val überschreiben.

Keine Änderung in der Open Source erforderlich.

Scala Cookbook from Safari

Code, der für mich in Scala 2.11.8

object TestIt extends App { 
    val jump = new TestIt 
    jump.sayWhat() 
} 
trait base { 
    val dontGoChangin: String = "dontGoChangin" 

    def sayWhat() = {println(dontGoChangin)} 
} 
class TestIt extends base{ 
    override val dontGoChangin: String = "toTryToPleaseMe" 
} 
+0

Wie ich verstehe, "Ich möchte nicht, dass meine Klasse in jeder Situation" callToSomeFunc() "aufruft, wenn sie das Merkmal A erbt, er wird sie nicht überschreiben, sondern nur ihre Zugänglichkeit schützen? –

+0

können Sie Val nicht neu zuweisen. – BigDataScholar

+0

Haben Sie sich den referenzierten Artikel angesehen? – WillD