Kotlin: Могу ли я переписать функцию другой функцией? (как переопределить) - PullRequest
1 голос
/ 07 марта 2020

Я Kotlin новичок. Я не уверен, правильно ли я стараюсь. Теперь я хочу переопределить и захватить переменные .

Предположим, это метод класса SOMETHING, который можно переопределить:

fun whoAreYou() {}

И это моя функция :

fun thisFuntionsIs(): ()->Unit {
    var i = 0
    println("It's parent Function!")
    return { println("It's child Function! ${i++}") }
}

Теперь я попытался переопределить существующую функцию новой:

fun whoAreYou() = thisFuntionsIs() // Suppose used the override keyword

Теперь, когда я запускаю эту функцию, она каждый раз выводит «родительское» сообщение.

Это не то, что я хотел.

Если бы whoAreYou было свойством, а не методом, оно бы сработало, я хотел.

class SOMETHING {
    var whoAreYou = ()->{} // If it was a property...
    // fun whoAreYou() {} // But the current situation is
}
SOMETHING.whoAreYou = thisFuntionsIs()
SOMETHING.whoAreYou() // Yea~ I wanted that

Есть ли решение? Или я совершенно не прав? Пожалуйста, помогите мне.

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Чтобы переопределить, вам нужно сделать родительский класс и функцию open, а затем переопределить функцию в расширенном классе:

open class Parent {
    protected var counter = 0;
    open fun whoAreYou() = "It's parent Function!"
}

class Child : Parent() {
    override fun whoAreYou() = "It's child Function! ${counter++}"
}

fun main() {
    val parent: Parent = Parent()
    val child: Parent = Child()

    println(parent.whoAreYou()) // It's parent Function!
    println(child.whoAreYou()) // It's child Function! 0
    println(child.whoAreYou()) // It's child Function! 1
    println(child.whoAreYou()) // It's child Function! 2
}
0 голосов
/ 07 марта 2020

Код работает. Может быть, вы просто неверно истолковали результаты. Слегка измененная версия:

fun main(args: Array<String>) {
    val x = SOMETHING()
    x.whoAreYou = thisFuntionsIs()
    x.whoAreYou()
    x.whoAreYou()
}

class SOMETHING {
    var whoAreYou = fun() {
        System.out.println("It's parent Function!")
    }
}

fun thisFuntionsIs(): () -> Unit {
    var i = 0
    System.out.println("It's Function!")
    return { System.out.println("It's lambda! ${i++}") }
}

Вывод:

>  It's Function!
>  It's lambda! 0
>  It's lambda! 1

Строка x.whoAreYou = thisFuntionsIs() означает, что вызывается thisFuntionsIs и x.whoAreYou назначается анонимной функции, возвращаемой thisFuntionsIs .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...