美文网首页
Kotlin最全语法学习——KotlinWithNotes项目

Kotlin最全语法学习——KotlinWithNotes项目

作者: CelebrateG | 来源:发表于2018-11-26 10:06 被阅读0次

      本项目总结了 Kotlin 几乎全部的知识点,代码中有详尽的注释,用以帮助理解。本人主要参考了 Kotlin 语言中文站Kotlin 教程 | 菜鸟教程 中的代码示例。部分知识难点如:委托模式、注解、反射,通过查阅《Kotlin实战》进行了相关总结,欢迎大家一起研究学习。

    项目地址:https://github.com/CelebrateG/KotlinWithNotes

    掘金地址

    kotlin委托的栗子

      委托是Kotlin中最独特和最强大的功能之一,下面是项目中的两个例子,
    Example1:

    /**
     * @Author CelebrateG
     * @Description 委托模式:操作的对象不用自己执行,而是把工作委托给另一个辅助对象
     * 类委托,kotlin 通过 by 关键字将接口实现委托给另一个对象
     */
    
    interface AnotherInterface{
        val message: String
        fun printSomething()
        fun printMessage()
    }
    
    /**
     * 接口实现类
     * 即受委托的类
     */
    class Impl(val x : Int) : AnotherInterface{
        override val message = "Impl: x = $x"
    
        override fun printMessage() {
            println("printMessage: $x")
        }
    
        override fun printSomething() {
            println("printSomething: $x")
        }
    }
    
    /**
     * by 关键字将接口的实现委托给了 i
     * 委托对象 i 为 Derived 的构造参数
     */
    class Derived(i : Impl) : AnotherInterface by i
    
    /**
     * 委托给 i 并重写了方法
     */
    class Derived2(i : Impl) : AnotherInterface by i{
        //此处调用 i 实现的message属性
        override fun printMessage() {
            println("Derived2.printMessage $message")
        }
    
    }
    
    /**
     * 测试方法
     */
    fun testFun(){
        val i = Impl(10)
        Derived(i).printSomething()
        Derived2(i).printMessage()
        println(Derived2(i).message)
    }
    
    fun main(args:Array<String>){
        testFun()
    }
    
    

    Example2:

    /**
     * @Author CelebrateG
     * @Description 委托属性
     * @Date  2018/10/26
     */
    
    /**
     * 通过 by 关键字编译器会自动生成一个辅助属性 val delegate = Delegate()
     * p 的访问都会调用对应 delegate 的 getValue 和 setValue 方法
     */
    class Example {
        var p: String by Delegate()
    }
    
    /**
     * 属性的委托不必实现任何的接口,
     * 但是需要提供一个 getValue() 函数
     * (与 setValue()函数——对于 var 属性)
     * 即将访问器的逻辑委托给一个辅助对象
     * 两函数都需要用 operator 关键字来进行标记
     */
    class Delegate{
        /**
         * thisRef 必须与属性所有者类型(对于扩展属性——指被扩展的类型)相同
         * 或者是它的超类型(可以理解为接受属性的实例)
         * property 必须是类型 KProperty<*> 或其超类型(可以理解为属性本身)
         * 函数必须返回与属性相同的类型(或其子类型)
         */
        operator fun getValue(thisRef : Any?,property : KProperty<*>):String{
            return "thisRef:$thisRef ,property:'${property.name}'"
        }
    
        /**
         * thisRef,property同上
         * value 必须与属性同类型或者是它的超类型
         */
        operator fun setValue(thisRef : Any?,property : KProperty<*>,value : String){
            println("value:${value.toString()},property:'${property.name}',thisRef:${thisRef.toString()}")
        }
    
    }
    
    
    /**
     * 自 Kotlin 1.1 起也可以在函数
     * 或代码块中声明一个委托属性
     */
    fun aFun(){
        var name : String by Delegate()
        name = "aFun"
        println(name)
    }
    
    

    包结构:

      基本按照 Kotlin 语言中文站目录划分,建议可以先从 grammer 目录基本语法开始看起。

    image

    项目中的依赖:

    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    androidTestImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
    implementation 'org.jetbrains.exposed:exposed:0.11.2'
    
    

    相关文章

      网友评论

          本文标题:Kotlin最全语法学习——KotlinWithNotes项目

          本文链接:https://www.haomeiwen.com/subject/ndyvqqtx.html