fun main() {
//sampleStart
open class Shape
class Rectangle: Shape()
fun Shape.getName() = "Shape"
fun Rectangle.getName() = "Rectangle"
fun printClassName(s: Shape) {
println(s.getName())
}
printClassName(Rectangle())
//sampleEnd
}
这段示例程序的打印结果将是 Shape, 因为调用哪个函数, 仅仅是由参数 s 声明的类型决定, 这里参数 s 的类型为 Shape 类.
fun main() {
//sampleStart
class Example {
fun printFunctionType() { println("Class method") }
}
fun Example.printFunctionType(i: Int) { println("Extension function #$i") }
Example().printFunctionType(1)
//sampleEnd
}
这段代码的输出将是 Class method.
但是, 我们完全可以使用同名称但不同参数的扩展函数, 来重载(overload)成员函数:
fun main() {
//sampleStart
class Example {
fun printFunctionType() { println("Class method") }
}
fun Example.printFunctionType(i: Int) { println("Extension function") }
Example().printFunctionType(1)
//sampleEnd
}
class MyClass {
companion object { } // 通过 "Companion" 来引用这个同伴对象
}
fun MyClass.Companion.printCompanion() { println("companion") }
fun main() {
MyClass.printCompanion()
}
扩展的范围
大多数情况下, 你可以直接在包之下的顶级位置定义扩展:
package org.example.declarations
fun List<String>.getLongestString() { /*...*/}
要在这个包之外使用扩展, 需要在调用处 import 这个扩展:
package org.example.usage
import org.example.declarations.getLongestString
fun main() {
val list = listOf("red", "green", "blue")
list.getLongestString()
}
open class Base { }
class Derived : Base() { }
open class BaseCaller {
open fun Base.printFunctionInfo() {
println("Base extension function in BaseCaller")
}
open fun Derived.printFunctionInfo() {
println("Derived extension function in BaseCaller")
}
fun call(b: Base) {
b.printFunctionInfo() // 这里会调用扩展函数
}
}
class DerivedCaller: BaseCaller() {
override fun Base.printFunctionInfo() {
println("Base extension function in DerivedCaller")
}
override fun Derived.printFunctionInfo() {
println("Derived extension function in DerivedCaller")
}
}
fun main() {
BaseCaller().call(Base()) // 输出结果为 "Base extension function in BaseCaller"
DerivedCaller().call(Base()) // 输出结果为 "Base extension function in DerivedCaller" - 派发接受者的解析过程是虚拟的
DerivedCaller().call(Derived()) // 输出结果为 "Base extension function in DerivedCaller" - 扩展接受者的解析过程是静态的
}