zoukankan      html  css  js  c++  java
  • Kotlin------类和对象(二)

    get/set方法

    声明一个属性的完整语法是

    var <propertyName>[: <PropertyType>] [= <property_initializer>]
        [<getter>]
        [<setter>]

    PropertyType、property_initializer、getter、setter均是可选的元素,这里再强调下,val类型变量为可读变量,所以只拥有get方法,而var类型则有get/set方法。这里直接自定义Student类的birthday的get/set方法

    class Student {
        ...
        var age: Int?//自定义get/set方法
            get() = field //使用备用字段自定义get/set方法
            set(value) {//value是自定义的变量名,名字可以随便起
                age = value
            }
        ...
    }

    接口

    Kotlin 的接口与 Java 8 类似,既包含抽象方法的声明,也包含实现。与抽象类不同的是,接口无法保存状态。它可以有属性但必须声明为抽象或提供访问器实现。

    public interface SomeInterface{
        var value:String //默认abstract
    
        fun reading() // 未实现
    
        fun writing(){  //已实现
            // do nothing
        }
    }
    class MyImpl:SomeInterface{
        override var value: String = "jason" //重载属性
        override fun reading() {
            // 方法体
        }  
    }

    枚举

    枚举类的最基本的用法是实现类型安全的枚举

    enum class Direction {
        NORTH, SOUTH, WEST, EAST
    }

    每个枚举常量都是一个对象。枚举常量用逗号分隔。

    使用:

     var color:Color=Color.BLUE
    println(Color.values()) println(Color.valueOf(
    "RED")) println(color.name) println(color.ordinal)//返回下标

    委托

    委托模式是一个很有用的模式,它可以用来从类中抽取出主要负责的部分。委托模式是Kotlin原生支持的,所以它避免了我们需要去调用委托对象。委托者只需要指定实现的接口的实例。

    interface Base {
        fun print()
    }
    
    class BaseImpl(val x: Int) : Base {
        override fun print() { print(x) }
    }
    
    class Derived(b: Base) : Base by b
    
    fun main(args: Array<String>) {
        val b = BaseImpl(10)
        Derived(b).print() // 输出 10
    }

    在 Derived 声明中,by 子句表示,将 b 保存在 Derived 的对象实例内部,而且编译器将会生成继承自 Base 接口的所有方法, 并将调用转发给 b。

     委托属性

    kotlin通过属性委托的方式,为我们实现了一些常用的功能,包括:

    1. 延迟属性(lazy properties): 其值只在首次访问时计算,
    2. 可观察属性(observable properties): 监听器会收到有关此属性变更的通知,
    3. 把多个属性储存在一个映射(map)中,而不是每个存在单独的字段中。

    延迟属性

    延迟属性我们应该不陌生,也就是通常说的懒汉。

    //标准委托 延迟属性
        val lazyValue : String by lazy {
               Log.d("m", "只执行1次")
               "value"
        }
     println(lazyValue)
     println(lazyValue)
    
     //执行
     D/m: 只执行1次
     I/System.out: value
     I/System.out: value

    可观察属性 Observable

    Delegates.observable() 接受两个参数:初始值和修改时处理程序(handler)。 每当我们给 属性赋值时会调用该处理程序(在赋值后执行)。它有三个参数:被赋值的属性、旧值和新 值:

    class User {
        var name: String by Delegates.observable("<no name>") {
            prop, old, new ->
            println("$old -> $new")
        }
    }
    //可观察属性 Observable
       val user = User()
       user.name = "first"
       user.name = "second"
    //执行结果
    I/System.out: <no name> -> first
    I/System.out: first -> second

    把属性储存在映射中

    一个常见的用例是在一个映射(map)里存储属性的值。 这经常出现在像解析 JSON 或者做其他“动态”事情的应用中。 在这种情况下,你可以使用映射实例自身作为委托来实现委托属性。

    class MapUser(val map: Map<String, Any?>) {
    
        val name: String by map
        val age: Int     by map
    }
    //把属性储存在映射
      val userMap = MapUser(mapOf(
            "name" to "小七",
            "age"  to 21
       ))
      println(userMap.name)
       println(userMap.age)
    //执行结果
    I/System.out: 小七
    I/System.out: 21
  • 相关阅读:
    其实吧
    一个很SB的方法,来开始调一个刚启动就SB的程序
    今天真的很SB
    32位程序关闭路径重定向
    WinDbg神断点
    SQLMap用户手册【超详细】

    真有敢干的
    21.递归
    16.数字大小升降排序编写
  • 原文地址:https://www.cnblogs.com/zhangqie/p/7456787.html
Copyright © 2011-2022 走看看