kotlin學習筆記

2021-09-21 07:41:25 字數 2227 閱讀 1222

屬性委託在單獨一頁中講:屬性委託。

委託模式已經證明是實現繼承的乙個很好的替代方式, 而 kotlin 可以零樣板**地原生支援它。derived類可以通過將其所有公有成員都委託給指定物件來實現乙個介面base

inte***ce base 

​class baseimpl(val x: int) : base }​

class derived(b: base) : base by b

​fun main()

執行結果:10
derived的超型別列表中的 by-子句表示b將會在derived中內部儲存, 並且編譯器將生成**給b的所有base的方法。

1.覆蓋符合預期:編譯器會使用override覆蓋的實現而不是委託物件中的。如果將override fun printmessage()新增到derived,那麼當呼叫printmessage時程式會輸出「abc」而不是「10」:

inte***ce base 

​class baseimpl(val x: int) : base

override fun printmessageline() }​

class derived(b: base) : base by b }​

fun main()

執行結果:abc10
2.但請注意,以這種方式重寫的成員不會在委託物件的成員中呼叫 ,委託物件的成員只能訪問其自身對介面成員實現:

inte***ce base 

​class baseimpl(val x: int) : base }​

class derived(b: base) : base by b

​fun main()

baseimpl: x = 10 message of derived

1.sealed class  子類型別有限的class

2.sealed class更在意的是型別,而列舉更在意的是資料

密封類用來表示受限的類繼承結構:當乙個值為有限集中的型別、而不能有任何其他型別時。在某種意義上,他們是列舉類的擴充套件:列舉型別的值集合也是受限的,但每個列舉常量只存在乙個例項,而密封類的乙個子類可以有可包含狀態的多個例項

要宣告乙個密封類,需要在類名前面新增sealed修飾符。雖然密封類也可以有子類,但是所有子類都必須在與密封類自身相同的檔案中宣告。(在 kotlin 1.1 之前, 該規則更加嚴格:子類必須巢狀在密封類宣告的內部)。

sealed class expr

data class const(val number: double) : expr()

data class sum(val e1: expr, val e2: expr) : expr()

object notanumber : expr()

(上文示例使用了 kotlin 1.1 的乙個額外的新功能:資料類擴充套件包括密封類在內的其他類的可能性。 )

使用密封類的關鍵好處在於使用when表示式 的時候,如果能夠驗證語句覆蓋了所有情況,就不需要為該語句再新增乙個else子句了。當然,這只有當你用when作為表示式(使用結果)而不是作為語句時才有用。

fun eval(expr: expr): double = when(expr)
把篩選的行為(函式)作為引數傳遞到過濾器中,簡介**,提高開發效率

乙個用函式作為引數或者返回值的函式

擴充套件函式

中綴表示式(infix用法)

當滿足下列條件的時候,函式還可以使用中綴符號呼叫:

當函式是成員函式或者擴充套件函式的時候

當他們僅有乙個引數的時候

當他們通過infix關鍵字標記的時候

如:

// 為int定義擴充套件函式

infix fun int.shl(x:int):int

//使用中綴符號呼叫擴充套件函式

1 shl 2

//等同於

1.shl(2)

Kotlin學習筆記

該系列文章是本人梳理kotlin基礎知識所作,時間倉促可能會有不足,歡迎指正!kotlin學習筆記 1 基礎語法 kotlin學習筆記 2 基本資料型別,字串與陣列 kotlin學習筆記 3 條件控制與迴圈控制 kotlin學習筆記 4 容器 kotlin學習筆記 5 泛型和高階函式應用 kotli...

Kotlin學習筆記(三) Kotlin密封類

前言 密封類,可以理解為列舉,規定了有限個型別,不可以存在其他型別,但列舉每個列舉常量只存在乙個示例,但是密封類的子類可以有多個示例,所以可以將密封類看做是列舉的拓展,基於列舉,高於列舉,青出於藍而勝於藍。正文密封類和普通類的區別,在於密封類使用了sealed修飾符,雖然密封類也可以有子類,但是所有...

kotlin學習筆記(六)

kotlin 有三種結構跳轉表示式 return break 結束最近的閉合迴圈 continue 跳到最近的閉合迴圈的下一次迴圈 上述表示式都可以作為更大的表示式的一部分 val s person.name return 這些表示式的型別是 nothing type 在 kotlin 中表示式可以...