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)  }