open class MyLogic { protected open val postfix = "ZZZ" open fun String.foo(prefix: String = "XXX"): String = transform(prefix + this + postfix) protected fun transform(a: String) = "$a:$a" fun result(): String { return "YYY".foo() } } open class MyLogicWithDifferentPostfix : MyLogic() { override val postfix = "WWW" } class MyLogicSpecified : MyLogic() { override fun String.foo(prefix: String): String = "$prefix::$this::$postfix" } fun box(): String { val result1 = MyLogic().result() if (result1 != "XXXYYYZZZ:XXXYYYZZZ") { return "fail1: ${result1}" } val result2 = MyLogicWithDifferentPostfix().result() if (result2 != "XXXYYYWWW:XXXYYYWWW") { return "fail2: ${result2}" } val result3 = MyLogicSpecified().result() if (result3 != "XXX::YYY::ZZZ") { return "fail3: ${result3}" } return "OK" }