屬性委託在單獨一頁中講:屬性委託。
委託模式已經證明是實現繼承的乙個很好的替代方式, 而 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()
執行結果:abc102.但請注意,以這種方式重寫的成員不會在委託物件的成員中呼叫 ,委託物件的成員只能訪問其自身對介面成員實現:
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 中表示式可以...