iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
0

簡介

在kotlin裡面,Object是一個關鍵字,它有兩種用法,一種是單例模式,一種是匿名類別。

1. Object Declaration 單例模式

也就是拿來當作宣告類別時的關鍵字。也是單例模式的用法。

companion object singleton {

    }

2. Object Expression 匿名類別

來看一個例子,父類別是Vehicle,然後我們創兩個子類別Car跟Truck,並把這兩個類別與一個匿名類別加入一個list。

open class Vehicle(val type: String, val tires: Int) {

    fun info() {
        println("type=$type, tires count = $tires")
    }
}

class Car : Vehicle("car", 4)

class Truck : Vehicle("truck", 6)

fun main(args: Array<String>) {

    var vehicles = mutableListOf<Vehicle>()

    vehicles.add(Car())
    vehicles.add(Truck())
    vehicles.add(object : Vehicle("custom", 10) {})

如果一個物件不常被用到,就不用特別幫他寫一個類別,而是在用到它的時候再去宣告它並實例化它就好。

舉另一個常用的例子,adapter丟給activity或fragment去override的點擊事件。

先看adapter。

class ChatAdapter : RecyclerView.Adapter<ChatAdapter.viewHolder>() {

    //宣告監聽器介面
    interface mItemClickListener{
        fun toClick(items:item)
    }
    //宣告一個監聽器類別繼承上面的介面,叫做mListener
    private var mListener:mItemClickListener? = null         
    //宣告方法,作為實例化監聽器的接口。
    fun setToClick(listener:mItemClickListener){         
        this.mListener = listener                        
    }

    
    inner class viewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        ...
            
            fun Bind(items: item) {
            ....
            }
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): viewHolder {
        .....
    }

    override fun getItemCount() = Data.itemList.count()
    override fun onBindViewHolder(holder: viewHolder, position: Int) {
        holder.Bind(Data.itemList[position])

        holder.itemLayout.setOnClickListener {
            mListener?.toClick(Data.itemList[position])

        }



    }


}


然後是Fragment的部分。

class FragmentChat : Fragment() {

    val chatAdapter = ChatAdapter()     
    
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.f2, container, false)
    }
    
    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        rv.layoutManager = LinearLayoutManager(context)
        rv.adapter = chatAdapter

        //使用了匿名類別object來實例化類別,並在這裡override它的抽象方法!
        chatAdapter.setToClick(object :ChatAdapter.mItemClickListener{
            override fun toClick(items: item) {
             ......
            }
        })

}

也就是在執行setToClick方法時,這個匿名類別當作一個參數傳入並直接在這裡將它實例化,而因為它是抽象類別,有內部方法需要override,所以必須將它在這裡override,程式碼最後就會長成這樣啦。這就是匿名類別的用法拉ˊˋ


上一篇
Kotlin :建構式與getter、setter用法
下一篇
Kotlin : 單例模式及kotlin object運作原理
系列文
Android Kotlin開發 -小嫩雞的30篇精選筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言