第一行代碼 第三版 第8章 8.5 kotlin 課堂 :泛型和委託

8.5 kotlin 課堂 :泛型和委託

8.5.1 泛型的基本用法

泛型 : 允許我們在不指定具體類型的情況下進行編程,可以是我們的代碼擁有更好的拓展性。

泛型 主要有兩種定義方式: 定義泛型類 定義泛型方法; 語法結構是****

class MyClass <T>{
	fun method(param :T): T {
		return param
	}
}

調用時就可以將泛型指定成具體的類型

val myClass =MyClass<Int> ()
val result = myClass.method(123)

只定義一個泛型方法

class MyClass {
	fun <T> method(param :T): T {
		return param
	}
}

調用時 也會發生一點改變。

val myClass =MyClass ()
val result = myClass.method(123)

Kotlin 允許我們對泛型的類型進行限制
Number 表示:將泛型上界 設置爲Number 類型;表明我們只能將method方法的泛型指定成數字類型

class MyClass {
	fun <T :Number> method(param :T): T {
		return param
	}
}

默認情況下,所有泛型都是可以指定成可空類型的,這是因爲在不動手指定上界的時候,泛型的默認上界是Any?;
如果想讓泛型的類型不可爲空,只需將上界指定成Any ;

8.5.2 類委託和委託屬性

委託是一種設計模式 :基本理念 :操作對象自己不會去處理某段邏輯,而是把工作委託給另外一個輔助對象去處理。

類委託 將一個類的具體實現委託給另一個類去完成。

藉助於委託模式:我們可以輕鬆實現一個自己的實現類。
如:定義一個MySet,並讓他實現Set接口:

class MySet<T> (val helprSet:HashSet<T>) :Set<T>{
    override val size: Int
        get() = helprSet.size

    override fun contains(element: T) = helprSet.contains(element)
    override fun containsAll(elements: Collection<T>)= helprSet.containsAll(elements)
    override fun isEmpty()=helprSet.isEmpty()
    override fun iterator()=helprSet.iterator()
}

這其中接收的一個HashSet參數,這就相當於一個輔助對象;然後在Set接口中的所有的方法的實現中,我們都沒有進行自己的實現,而是調用了輔助對象中的相應的方法實現。這就是一種委託模式。
好處:我們可以只實現大部分方法,少部分的方法可以有自己來重寫,甚至加入一些自己獨有的方法。
爲了避免調用對象中的待實現方法過多的情況:kotlin提供瞭解決方法;

kotlin中委託使用的關鍵字是 by

class MySet<T>(val helperSet:HashSet<T>):Set<T> by helperSet{
}

該段代碼功能與上面的代碼相同。
如果想對某個方法進行重新實現,可以單獨重寫那個方法;

委託屬性 將一個屬性(字段)的具體實現委託給另外一個類去完成

委託屬性的語法結構:

class MyClass{
	var p by Delegate()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章