Kotlin能否像C++一样无需继承父类就在类外定义类函数?
答案
完全可以,Kotlin提供的扩展函数特性就是专门对应这类需求的实现,不需要继承原有类,也不需要修改原有类的源代码。
语法对应
你给出的C++类外定义成员函数的语法:
returnType className::FunctionName(){ //FUNCTION BODY }
在Kotlin中对应的扩展函数语法如下:
fun className.functionName(): returnType { // 函数体 // 函数内可以用this指代调用该函数的类实例 }
实际示例
比如我们可以给原生的String类额外添加一个统计元音字母数量的函数:
fun String.countVowels(): Int { val vowels = setOf('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U') return this.count { char -> char in vowels } }
调用方式和类原生成员函数完全一致:
// 调用示例,返回结果为3 val vowelCount = "Hello World".countVowels()
注意事项
- 扩展函数是静态解析的,本质没有修改原有类的结构,因此默认无法访问原有类的
private/protected修饰的私有成员,这点和C++类外定义的原生成员函数有区别。如果是你自行维护的类,可以将扩展函数定义在和类同模块的代码中,即可访问类的internal成员。 - 扩展函数同样支持泛型适配,比如给所有可变列表添加交换元素的方法:
fun <T> MutableList<T>.swap(index1: Int, index2: Int) { val temp = this[index1] this[index1] = this[index2] this[index2] = temp } // 调用示例 val list = mutableListOf(1,2,3) list.swap(0,2) // 执行后list变为[3,2,1]
内容的提问来源于stack exchange,提问作者Abdullah Omer
相关产品推荐
相关产品推荐

