В Kotlin наследуются ли значения параметров по умолчанию для абстрактных функций? - PullRequest
1 голос
/ 11 марта 2020

В Kotlin вы можете определить абстрактную функцию со значением по умолчанию.

Будет ли это значение по умолчанию переноситься на реализующие функции, без необходимости указывать один и тот же параметр по умолчанию в каждом из реализации?

Ответы [ 2 ]

5 голосов
/ 11 марта 2020

Мало того, что «нет необходимости указывать один и тот же параметр по умолчанию в каждой из реализаций», это даже не разрешено.

В методах переопределения всегда используются одинаковые значения параметров по умолчанию в качестве базового метода. При переопределении метода со значениями параметров по умолчанию значения параметров по умолчанию должны быть опущены в сигнатуре:

open class A {
    open fun foo(i: Int = 10) { /*...*/ }
}

class B : A() {
    override fun foo(i: Int) { /*...*/ }  // no default value allowed
}

Для комментария

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

Другой вариант - сделать метод, который вы можете переопределить:

interface IParent {
    fun printSomething(argument: String = defaultArgument())

    fun defaultArgument(): String = "default"
}

class Child : IParent {
    override fun printSomething(argument: String){
        println(argument)
    }

    override fun defaultArgument(): String = "child default"
}

Child().printSomething() // prints "child default"
3 голосов
/ 11 марта 2020

(можно задавать и отвечать на собственные вопросы)

Приведенный ниже код подтверждает, что значение по умолчанию передается реализации.

interface IParent {
    fun printSomething(argument: String = "default") // default val specified in interface
}

class Child : IParent {
    override fun printSomething(argument: String){ // no default val specified in impl.
        println(argument)
    }
}

Child().printSomething() // compiles successfully, and prints "default"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...