Kotlin - Jak przekazać funkcje do klasy?

0

Witam, jest jakaś możliwość przekazania funkcji do klasy?

w głownej klasie aktywności mam funkcje "wyswietlPosty()" i chcialbym ja przekazac do klasy która jest poza klasą głównej aktywności.

1

Mógłbyś wrzucić kawałek kodu dla kontekstu? Masz problem z przekazaniem funkcji jakiejkolwiek np. z określeniem typu argumentu, jaki powinna przyjmować funkcja, do której chcesz przekazać np. wyswietlPosty, czy z sytuacją gdy funkcja jest metodą klasy?

Jeśli to drugie, to rozwiązanie jest całkiem proste:

val odwolanie = Foo::bar

Jeśli to pierwsze, to musisz określić co przekazywana jako argument funkcja będzie przyjmować i co zwracać jako typ np.

fun mojaFunkcja(arg: String, func: (String) -> Unit) {
   func(arg)
}

Tutaj mojaFunkcja przyjmuje jako drugi argument funkcję przyjmującą String i nie zwracająca niczego (znaczy Unit)

Wywołać ją możesz zarówno dla funkcji statycznej (zdefiniowanej wewnątrz companion object) jak i metody klasy (wtedy musisz się do niej odwołać z instancji albo kombinować z typem KFunction, czego właściwie nie próbowałem, ale śmiało)

mojaFunkcja(jakisArgument, Foo::funkcjaZCompanionObject)

val foo = Foo()
mojaFunkcja(jakisArgument, foo::funkcjaJakoMetodaKlasy)

Tu masz dokumentację :)

2

Funkcje możesz przekazywać tak samo jak każdy inny obiekt. Poniżej masz mały przykład.

class MojaKlasa(private val func1: (Int) -> Int) {
  fun uzyjFunkcjiKonstruktoraNaWartosci(wartosc: Int) = func1(wartosc)
    
  fun uzyjFunkcjiNaLiczbieDwa(func2: (Int) -> Int) = func2(2)
}

fun podzielPrzezDwa(wartosc: Int) = wartosc / 2

fun main() {
  val pomnozPrzezDwa: (Int) -> Int = { it * 2 }
  val klasa = MojaKlasa(pomnozPrzezDwa)
    
  val a = klasa.uzyjFunkcjiKonstruktoraNaWartosci(4)
  println(a)
    
  val b = klasa.uzyjFunkcjiNaLiczbieDwa(pomnozPrzezDwa)
  println(b)
    
  val c = klasa.uzyjFunkcjiNaLiczbieDwa(::podzielPrzezDwa)
  println(c)
}

Z kolei jeżeli chcesz przekazywać funkcję np. z jednej aktywności do drugiej, to będzie to bardzo problematyczne i na pewno nie jest to coś, co chciałbyś zrobić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1