В Kotlin вы можете определить абстрактную функцию со значением по умолчанию.
Будет ли это значение по умолчанию переноситься на реализующие функции, без необходимости указывать один и тот же параметр по умолчанию в каждом из реализации?
Мало того, что «нет необходимости указывать один и тот же параметр по умолчанию в каждой из реализаций», это даже не разрешено.
В методах переопределения всегда используются одинаковые значения параметров по умолчанию в качестве базового метода. При переопределении метода со значениями параметров по умолчанию значения параметров по умолчанию должны быть опущены в сигнатуре: open class A { open fun foo(i: Int = 10) { /*...*/ } } class B : A() { override fun foo(i: Int) { /*...*/ } // no default value allowed }
В методах переопределения всегда используются одинаковые значения параметров по умолчанию в качестве базового метода. При переопределении метода со значениями параметров по умолчанию значения параметров по умолчанию должны быть опущены в сигнатуре:
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"
(можно задавать и отвечать на собственные вопросы)
Приведенный ниже код подтверждает, что значение по умолчанию передается реализации.
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"