interface IBase { fun foo(x: Int, s: String) fun bar(): Int fun String.qux() } object BaseImpl : IBase { override fun foo(x: Int, s: String) {} override fun bar(): Int = 42 override fun String.qux() {} } interface IOther { val x: String var y: Int val Byte.z1: Int var Byte.z2: Int } fun otherImpl(x0: String, y0: Int): IOther = object : IOther { override val x: String = x0 override var y: Int = y0 override val Byte.z1: Int get() = 1 override var Byte.z2: Int get() = 2 set(value) {} } class Test1 : IBase by BaseImpl class Test2 : IBase by BaseImpl, IOther by otherImpl("", 42)