2017-06-10 12 views
1

Lassen Sie uns sagen, dass wir die folgende Erweiterungsfunktion haben:Zugriff auf statische Erweiterungsfunktion von einer anderen Klasse in Kotlin?

class Helper { 
    companion object { 
    fun Int.plus(value: String) = Integer.valueOf(value).plus(this) 
    } 

}

Wie können Sie Zugriff auf die plus Erweiterungsfunktion von der Helper Klasse in eine andere Klasse. Gibt es eine Möglichkeit, wo wir so etwas wie dies zum Beispiel tun können:

class OtherClass { 
    fun someMethod() { 
    val eight = 7.Helper.Companion.plus("1") 
    } 

}

Antwort

1

Eine Erweiterung wie folgt deklariert ist ein member extension function und ist nur sichtbar in der Helper Klasse sein würde. Wenn Sie außerhalb dieser Klasse darauf zugreifen müssen, fügen Sie es in einen größeren Bereich ein, z. B. machen Sie es zu einer Top-Level-Funktion. Alternativ können Sie eine reguläre Funktion erstellen, die zwei Parameter benötigt, wenn Sie sie innerhalb einer Klasse beibehalten möchten.


Als zusätzlicher Hinweis, diese Funktion ein operator markieren können, wenn Sie es mit dem + Symbol verwenden möchten: Int.plus(value: String)

operator fun Int.plus(value: String) = Integer.valueOf(value) + this 

val x = 2 + "25" 
+0

Danke, dass Sie sich die Zeit genommen haben, diese Frage zu beantworten. – user2491598

3

In Ihrem Beispiel ist eine Memberfunktion des Helper.Companion Objekt (die Tatsache, dass es ein Begleitobjekt ist oder dass es sich in einer anderen Klasse befindet, spielt keine Rolle). Dieser Fall wird im Abschnitt Declaring Extensions as Members der Dokumentation beschrieben.

Kurz gesagt, eine Funktion mit zwei Empfängern (eine Erweiterung Empfänger von Int Typ und ein Dispatch-Empfänger vom Typ Helper.Companion) zugreifen, die Sie haben, sie beide in dem Rahmen haben.

Dies kann auf verschiedene Arten erreicht werden:

with(Helper.Companion) { 
    239.plus("") 
} 

oder

with(Helper.Companion) { 
    with(239) { 
     plus("") 
    } 
} 

P. S. Das Einfügen einer Erweiterungsfunktion in ein Begleitobjekt ist sehr unregelmäßig und nicht idiomatisch. Ich kann mir kaum vorstellen, warum du das brauchst.

+0

Vielen Dank für Ihre Antwort :) – user2491598

Verwandte Themen