今天同事提到kotlin的拓展函数,他觉得kotlin这个概念很牛,浅浅学了一下,从里面闻到到和C++一样的味道。也许他之前是写java的吧,java没有这个东西。
同时今天发现了kotlin官方文档中文翻译
拓展函数的优点
Kotlin 的拓展函数是一种强大的机制,它允许我们在不修改类定义的情况下向类添加新的功能。通过使用拓展函数,我们可以提高代码的可读性和可维护性,使代码更加模块化和灵活。
语法定义
fun ClassName.functionName(parameters): ReturnType {
// 函数体
}
其中,ClassName 是我们希望给其添加新功能的类名,functionName 是我们为该类定义的新函数名。parameters 是函数的参数列表,ReturnType 是函数的返回类型
举例
下面是一个拓展函数的例子,我们为 String 类添加一个 customLength() 函数,用于计算字符串的长度:
fun String.customLength(): Int {
var count = 0
for (char in this) {
count++
}
return count
}
在上面的例子中,String 是我们希望给其添加新功能的类名,customLength 是我们为该类定义的新函数名。该函数没有参数,返回一个整数类型的值,表示字符串的长度。在函数体中,我们使用了 this 关键字来引用调用该函数的字符串对象。
使用拓展函数与调用普通函数一样简单。例如,我们可以像下面这样调用上述定义的 customLength() 函数:
val str = "Hello, World!"
val length = str.customLength()
println("字符串的长度为:$length")
输出结果为:
字符串的长度为:13
除了在拓展函数中使用 this 关键字引用调用对象外,我们还可以使用 this 关键字来引用调用对象的属性和方法。
需要注意的是,拓展函数并不能访问类的私有成员,它只能访问类的公共成员。
运算符重载
当我们在编写 Kotlin 程序时,有时候希望能够对自定义的类进行运算符操作,比如对两个对象进行相加、相减等操作。为了实现这个需求,Kotlin 提供了运算符重载的功能。
运算符重载是指在类中定义特定的函数来改变运算符的行为。通过重载运算符,我们可以自定义类的对象之间的运算行为,使其更符合我们的需求。
Kotlin 支持重载的运算符包括:+、-、、/、%、++、–、+=、-=、=、/=、%=、==、!=、<、>、<=、>=、[]、()、= 等。
下面是一个例子,我们定义了一个名为 Point 的类,用于表示二维平面上的一个点。我们希望能够对两个 Point 对象进行相加、相减操作,并重载 + 和 - 运算符:
class Point(val x: Int, val y: Int) {
operator fun plus(other: Point): Point {
return Point(x + other.x, y + other.y)
}
operator fun minus(other: Point): Point {
return Point(x - other.x, y - other.y)
}
}
fun main() {
val p1 = Point(3, 4)
val p2 = Point(1, 2)
val sum = p1 + p2
println("相加后的点:(${sum.x}, ${sum.y})")
val diff = p1 - p2
println("相减后的点:(${diff.x}, ${diff.y})")
}
在上面的例子中,我们在 Point 类中定义了 plus() 和 minus() 函数,并使用 operator 关键字来标记这两个函数是运算符重载函数。plus() 函数用于重载 + 运算符,实现两个点的相加操作;minus() 函数用于重载 - 运算符,实现两个点的相减操作。
在 main() 函数中,我们创建了两个 Point 对象 p1 和 p2,然后使用 + 和 - 运算符对它们进行操作,并将结果打印出来。
输出结果为:
相加后的点:(4, 6)
相减后的点:(2, 2)
通过重载运算符,我们可以使自定义的类对象之间的运算更加直观和易于理解。运算符重载为我们提供了更大的灵活性和可读性,使代码更加优雅和简洁。
需要注意的是,运算符重载函数必须在类内部定义,并且使用 operator 关键字进行标记。此外,不是所有的运算符都可以被重载,具体可以参考 Kotlin 的文档。
总而言之,Kotlin 的运算符重载功能为我们提供了一种定制类对象运算行为的方式。通过重载运算符,我们可以使代码更加简洁和易于理解,提高程序的可读性和可维护性。