Kotlin入门之extentions
2017-09-04 16:13
183 查看
(转载)http://www.jianshu.com/p/eff1dc615e5d
前文讲过,Kotlin, 跟C#和Gosu很像,提供了便捷的为类扩展函数的能力,而你并不需要继承于它,或者使用设计模式来包装,比如
需要强调的是扩展函数只能“在调用处静态的工作”, 意思是调用处传入的参数是谁就是谁,不支持多态。
举例:
例子中输出的结果是
如果一个类拥有一个成员函数,但是又定义了一个这个类的扩展函数和它的成员函数名字一模一样,参数也一样,此时只执行成员函数。
举例:
比如我们调用 类
与上述其他情况相同,名字相同但是函数签名不同时,扩展函数工作完全正常,举例:
调用 C().foo(1) 时将会输出“extension”.
注意,扩展函数并未向类中插入函数 , 扩展属性在类中也并没有支持字段(
接下来会讲述友元对象扩展以及扩展的作用域。
前文讲过,Kotlin, 跟C#和Gosu很像,提供了便捷的为类扩展函数的能力,而你并不需要继承于它,或者使用设计模式来包装,比如
需要强调的是扩展函数只能“在调用处静态的工作”, 意思是调用处传入的参数是谁就是谁,不支持多态。
举例:
例子中输出的结果是
如果一个类拥有一个成员函数,但是又定义了一个这个类的扩展函数和它的成员函数名字一模一样,参数也一样,此时只执行成员函数。
举例:
比如我们调用 类
与上述其他情况相同,名字相同但是函数签名不同时,扩展函数工作完全正常,举例:
调用 C().foo(1) 时将会输出“extension”.
注意,扩展函数并未向类中插入函数 , 扩展属性在类中也并没有支持字段(
接下来会讲述友元对象扩展以及扩展的作用域。
作者:I二师兄I
链接:http://www.jianshu.com/p/eff1dc615e5d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
前文讲过,Kotlin, 跟C#和Gosu很像,提供了便捷的为类扩展函数的能力,而你并不需要继承于它,或者使用设计模式来包装,比如
Decorator装饰者模式. 我们使用一种特殊的声明方式来完成这个工作 . Kotlin 支持函数和属性的扩展.
扩展函数(Extentions)的“静态执行”
然而,Kotlin并不实际修改它所扩展的类,给某个类定义了一个扩展函数也并没有实际为这个插入任何函数代码,仅仅是增加了一个这个类的调用函数的途径,调用方式xx.extentionsFunc。需要强调的是扩展函数只能“在调用处静态的工作”, 意思是调用处传入的参数是谁就是谁,不支持多态。
举例:
open class C class D: C() fun C.foo() = "c" fun D.foo() = "d" fun printFoo(c: C) { println(c.foo()) } printFoo(D())
例子中输出的结果是
c。扩展函数被调用时,传入的参数是
c, 即类C。
如果一个类拥有一个成员函数,但是又定义了一个这个类的扩展函数和它的成员函数名字一模一样,参数也一样,此时只执行成员函数。
举例:
class C { fun foo() { println("member") } } fun C.foo() { println("extension") }
比如我们调用 类
C的任意实例
c的
c.foo()函数 , 只会打印 “member”, 而不是“extension”.
与上述其他情况相同,名字相同但是函数签名不同时,扩展函数工作完全正常,举例:
class C { fun foo() { println("member") } } fun C.foo(i: Int) { println("extension") }
调用 C().foo(1) 时将会输出“extension”.
空接收者
注意扩展可以使用空接收类型,如此扩展就可以被一个即使值为null的变量所调用,而且可以在扩展函数体中执行检查this == null。这就是为什么在Kotlin中你不用检查是否为null就可以调用
toString: 检查发生在扩展函数中。
fun Any?.toString(): String { if (this == null) return "null" // after the null check, 'this' is autocast to a non-null type, so the toString() below // resolves to the member function of the Any class return toString() }
扩展属性
类似扩展函数,Kotlin同样支持扩展属性:val <T> List<T>.lastIndex: Int get() = size - 1
注意,扩展函数并未向类中插入函数 , 扩展属性在类中也并没有支持字段(
backing field)。这就是为什么初始化程序(initializers)不允许扩展属性。 只有在显示提供
getters/setters后才可以定义扩展属性,举例:
val Foo.bar = 1 // error: initializers are not allowed for extension properties
接下来会讲述友元对象扩展以及扩展的作用域。
前文讲过,Kotlin, 跟C#和Gosu很像,提供了便捷的为类扩展函数的能力,而你并不需要继承于它,或者使用设计模式来包装,比如
Decorator装饰者模式. 我们使用一种特殊的声明方式来完成这个工作 . Kotlin 支持函数和属性的扩展.
扩展函数(Extentions)的“静态执行”
然而,Kotlin并不实际修改它所扩展的类,给某个类定义了一个扩展函数也并没有实际为这个插入任何函数代码,仅仅是增加了一个这个类的调用函数的途径,调用方式xx.extentionsFunc。需要强调的是扩展函数只能“在调用处静态的工作”, 意思是调用处传入的参数是谁就是谁,不支持多态。
举例:
open class C class D: C() fun C.foo() = "c" fun D.foo() = "d" fun printFoo(c: C) { println(c.foo()) } printFoo(D())
例子中输出的结果是
c。扩展函数被调用时,传入的参数是
c, 即类C。
如果一个类拥有一个成员函数,但是又定义了一个这个类的扩展函数和它的成员函数名字一模一样,参数也一样,此时只执行成员函数。
举例:
class C { fun foo() { println("member") } } fun C.foo() { println("extension") }
比如我们调用 类
C的任意实例
c的
c.foo()函数 , 只会打印 “member”, 而不是“extension”.
与上述其他情况相同,名字相同但是函数签名不同时,扩展函数工作完全正常,举例:
class C { fun foo() { println("member") } } fun C.foo(i: Int) { println("extension") }
调用 C().foo(1) 时将会输出“extension”.
空接收者
注意扩展可以使用空接收类型,如此扩展就可以被一个即使值为null的变量所调用,而且可以在扩展函数体中执行检查this == null。这就是为什么在Kotlin中你不用检查是否为null就可以调用
toString: 检查发生在扩展函数中。
fun Any?.toString(): String { if (this == null) return "null" // after the null check, 'this' is autocast to a non-null type, so the toString() below // resolves to the member function of the Any class return toString() }
扩展属性
类似扩展函数,Kotlin同样支持扩展属性:val <T> List<T>.lastIndex: Int get() = size - 1
注意,扩展函数并未向类中插入函数 , 扩展属性在类中也并没有支持字段(
backing field)。这就是为什么初始化程序(initializers)不允许扩展属性。 只有在显示提供
getters/setters后才可以定义扩展属性,举例:
val Foo.bar = 1 // error: initializers are not allowed for extension properties
接下来会讲述友元对象扩展以及扩展的作用域。
作者:I二师兄I
链接:http://www.jianshu.com/p/eff1dc615e5d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章推荐
- Kotlin学习笔记1-3 入门-代码规范
- Kotlin入门(5)字符串及其格式化
- kotlin入门
- Kotlin入门系列教程—图片识别
- Kotlin入门篇(一),基本数据类型介绍、变量和常量的声明
- Kotlin入门(14)继承的那些事儿
- 在Kotlin中使用Dagger2最简单的入门例子
- Kotlin入门-HelloKotlin
- kotlin开发Android入门篇五方法以及属性的拓展
- 一周入门Kotlin(一)
- Android kotlin入门与基础语法一
- 【Kotlin从入门到深坑】之返回和跳转
- Kotlin入门(11)江湖绝技之特殊函数
- 荐书 | Kotlin开发快速入门与实战
- (转)kotlin官方文档-第一章入门
- 【Kotlin从入门到深坑】之类的属性和字段
- Kotlin入门学习总结
- Kotlin入门语法
- Kotlin最简单的入门教程——基础类型(一)
- Step into Kotlin - 01 - 入门