在kotlin裡面,Object是一個關鍵字,它有兩種用法,一種是單例模式,一種是匿名類別。
也就是拿來當作宣告類別時的關鍵字。也是單例模式的用法。
companion object singleton {
}
來看一個例子,父類別是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,程式碼最後就會長成這樣啦。這就是匿名類別的用法拉ˊˋ