Kotlin之构造规则

  • 2019 年 10 月 4 日
  • 筆記

之前我们介绍了Kotlin的流程控制和标准库常用扩展,今天我们聊聊类的构造和继承的一些常规

Constructors

在Kotlin的森林法则中一个class有一个Primary Constructor除此之外可以有多个secondary constructor。Primary Constructor处于class声明的头位置—紧跟这类名

例如

class Person constructor(firstName: String) {    }

而默认情况下Primary constructor中的construct是可以省略的,因此可以简化为:

class Person(val firstName: String) {    }

介绍完了Primary COnstructor我们看看Secondary Constructor—-与Primary不同,secondary的constructor关键字并不能省略,并且必须是处于class声明体内部。除此之外,加入class有primary constructor的情况下,secondary还需要直接或者非直接的采用this作为关键词去代理Primary的构造完成数据的传递与统一

class Person( var firstName: String) {      constructor(firstName: String, age: Int) : this(firstName) {      }  }

继承

在Kotlin的体系中所有的类都有一个共同的父类Any并且这个Any作为所有类缺省的默认超级父类

class Person

甚至这么简单的声明的一个class也是Any的子类,并且默认的继承了equals() hasCode() 和 toString()这三个基本的方法

继承中的构造函数

上文中我们说了构造函数,那么继承中是怎么处理这些构造函数的呢?

1 Primary

假如父类有了Primary那么子类要有Primary的构造(非必须的)

open  class Base(p: Int)  class Derived(p: Int) : Base(p) {      constructor(p:Int, tag:String):this(p)  }

上栗中 Base有了Primary的构造方法,因此子类Derived也必须要有一个,但是不影响子类有secondary的构造方法

2 Secondary

假如子类不去依据父类添加Primary构造方法,那么对于子类来说需要在Secondary去deleagte父类的Primary沟构造方法,并且每个Secondary构造都需要去deleaget一下父类的Primary构造

open  class Base(p: Int)  class Derived:Base{      constructor(p:Int, tag:String):super(p)  }