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

2018-11-26  本文已影响0人  CelebrateG

  本项目总结了 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'

上一篇 下一篇

猜你喜欢

热点阅读