第8章 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()
}