之前我们介绍了Kotlin的流程控制和标准库常用扩展,今天我们聊聊类的构造和继承的一些常规
Constructors
在Kotlin的森林法则中一个class有一个Primary Constructor除此之外可以有多个secondary constructor。Primary Constructor处于class声明的头位置---紧跟这类名
例如
代码语言:javascript复制class Person constructor(firstName: String) {
}
而默认情况下Primary constructor中的construct是可以省略的,因此可以简化为:
代码语言:javascript复制class Person(val firstName: String) {
}
介绍完了Primary COnstructor我们看看Secondary Constructor----与Primary不同,secondary的constructor关键字并不能省略,并且必须是处于class声明体内部。除此之外,加入class有primary constructor的情况下,secondary还需要直接或者非直接的采用this作为关键词去代理Primary的构造完成数据的传递与统一
代码语言:javascript复制class Person( var firstName: String) {
constructor(firstName: String, age: Int) : this(firstName) {
}
}
继承
在Kotlin的体系中所有的类都有一个共同的父类Any并且这个Any作为所有类缺省的默认超级父类
代码语言:javascript复制class Person
甚至这么简单的声明的一个class也是Any的子类,并且默认的继承了equals() hasCode() 和 toString()这三个基本的方法
继承中的构造函数
上文中我们说了构造函数,那么继承中是怎么处理这些构造函数的呢?
1 Primary
假如父类有了Primary那么子类要有Primary的构造(非必须的)
代码语言:javascript复制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构造
代码语言:javascript复制open class Base(p: Int)
class Derived:Base{
constructor(p:Int, tag:String):super(p)
}