用对象函数代替接口

5年以前  |  阅读数:570 次  |  编程语言:Kotlin 

kotlin 的把函数作为一个对象来使用,这样极大的扩展了代码了灵活度,很多时候减少了我们不少代码量,但是也增加了学习难度。这里我们来用一个对象函数来替代一个 lisenter 接口

1. 类内部声明一个对象函数,并使用

open class Book(var name: String) : Cat(), Foo {

    // 没有返回值用 Unit
    lateinit var getData: (name: String, age: Int) -> String

    fun String.aact(str: String): String {
        return   name.aact(name)
    }

2. 外部类实现这个对象函数

class MainActivity<T : String> : AppCompatActivity() {

// 方法一:传递一个声明相同的方法,类似于实现接口方法
book1.getData = this@MainActivity::getData

fun getData(name: String,age:Int): String {
    return "5555"
}

// 方法二:实现匿名方法,先把参数再声明一下,后面具体实现逻辑即可
book1.getData = { name: String, age: Int ->
    text_name.toString()
    }
}

3. 还可以用 typealias 类型别名代替接口

// 在 class 外声明,作用域和平常类一样
typealias Click = (String, String) -> Int

class BookData(map: MutableMap<String, Any>) {

    fun my(click: Click) {
        click("GG", "AA")
    }

    fun test2() {
        // typealias 填参数时和函数式对象一样
        my { name, age ->
            Log.d("AA", "my 方法参数传入")
            return@my 10
        }
    }
}
 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
贪吃蛇
文件下载
双位运算符
发送邮件
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
提取后缀名
年的日历图
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例