日期: 2022-09-20 22:33:08 浏览数:2

上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
海宁网站设计

若扩展函数和成员函数一致,则使用该函数时,会优先使用成员函数。
class C {
fun foo() { println("成员函数") }}fun C.foo() { println("扩展函数") }fun main(arg:Array<String>){
var c = C()
c.foo()}实例执行输出结果为:
成员函数
在扩展函数内, 可以通过 this 来判断接收者是否为 NULL,这样,即使接收者为 NULL,也可以调用扩展函数。例如:
fun Any?.toString(): String {
if (this == null) return "null"
// 空检测之后,“this”会自动转换为非空类型,所以下面的 toString()
// 解析为 Any 类的成员函数
return toString()}fun main(arg:Array<String>){
var t = null
println(t.toString())}实例执行输出结果为:
null
扩展属性
除了函数,Kotlin 也支持属性对属性进行扩展:
val <T> List<T>.lastIndex: Int get() = size - 1
扩展属性允许定义在类或者kotlin文件中,不允许定义在函数中。初始化属性因为属性没有后端字段(backing field),所以不允许被初始化,只能由显式提供的 getter/setter 定义。
val Foo.bar = 1 // 错误:扩展属性不能有初始化器
扩展属性只能被声明为 val。
如果一个类定义有一个伴生对象 ,你也可以为伴生对象定义扩展函数和属性。
伴生对象通过"类名."形式调用伴生对象,伴生对象声明的扩展函数,通过用类名限定符来调用:
class MyClass {
companion object { } // 将被称为 "Companion"}fun MyClass.Companion.foo() {
println("伴随对象的扩展函数")}val MyClass.Companion.no: Int
get() = 10fun main(args: Array<String>) {
println("no:${MyClass.no}")
MyClass.foo()}实例执行输出结果为:
no:10伴随对象的扩展函数
通常扩展函数或属性定义在顶级包下:
package foo.bar
fun Baz.goo() { …… }要使用所定义包之外的一个扩展, 通过import导入扩展的函数名进行使用:
package com.example.usageimport foo.bar.goo // 导入所有名为 goo 的扩展
// 或者import foo.bar.* // 从 foo.bar 导入一切fun usage(baz: Baz) {
baz.goo()}在一个类内部你可以为另一个类声明扩展。
在这个扩展中,有个多个隐含的接受者,其中扩展方法定义所在类的实例称为分发接受者,而扩展方法的目标类型的实例称为扩展接受者。
class D {
fun bar() { println("D bar") }}class C {
fun baz() { println("C baz") }
fun D.foo() {
bar() // 调用 D.bar
baz() // 调用 C.baz
}
fun caller(d: D) {
d.foo() // 调用扩展函数
}}fun main(args: Array<String>) {
val c: C = C()
val d: D = D()
c.caller(d)}实例执行输出结果为:
D bar C baz
在 C 类内,创建了 D 类的扩展。此时,C 被成为分发接受者,而 D 为扩展接受者。从上例中,可以清楚的看到,在扩展函数中,可以调用派发接收者的成员函数。
假如在调用某一个函数,而该函数在分发接受者和扩展接受者均存在,则以扩展接收者优先,要引用分发接收者的成员你可以使用限定的 this 语法。
class D {
fun bar() { println("D bar") }}class C {
fun bar() { println("C bar") } // 与 D 类 的 bar 同名
fun D.foo() {
bar() // 调用 D.bar(),扩展接收者优先
this@C.bar() // 调用 C.bar()
}
fun caller(d: D) {
上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。
服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)