kotlin 之美(平滑过渡)

kotlin.jpeg

kotlin 和 java 的关系感觉就像 typescript 和 javascript 的关系。Kotlin 做法并不是革命式推翻项目中原有的老大地位,而是可以和老大融洽共处,让老大发现他好从而自身改变。
kotlin 扩展函数非常简单,只要把扩展类放置在函数名前面就搞定。

    var title:String = "angular"
    fun String.titlelastChar():Char = this.get(this.length - 1)

    println(title.titlelastChar())

这里String函数接受者,this代表接受类型实例对象,看起来有点像 go 语言 structinterface的实现。

扩展函数并不允许打破类封闭性,扩展函数中是无法访问到类私有或者受保护的成员。
扩展函数在 java 中也是可调用的使用的。

    public static void main(String[] args) {
        char c = StringUtilKt.titlelastChar("angluar");
        System.out.println(c);
    }
open class View{
    open fun click() = println("clicked on view")
}

open class Button:View(){
    override fun click() = println("clicked on button")
}
    val view:View = View()
    val btn:View = Button()
    view.click()
    btn.click()

在 OOP 的语言中子类重现父类方法是一件极为平常事。即便向上转型也会调用子类的方法。

clicked on view
clicked on button

但是扩展函数并不是类的一部分,我们做一个实验让基类ViewButton都扩展了showOff方法。

    fun View.showOff() = println("call showOff of view")
    fun Button.showOff() = println("call showOff of button")
 
    val btn:View = Button()
    btn.showOff()
call showOff of view

发现 button 向上转型调用时 View 的 showOff 方法而非自己本身的 showOff 方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容