接口與抽象類的區(qū)別
同樣在Kotlin中也有接口的概念竞川,與Java不同的是膀曾,Kotlin中的接口可以定義變量,但是不能為變量提供構(gòu)造函數(shù)浪读,也可以實現(xiàn)函數(shù)體昔榴,如果沒有實現(xiàn)的函數(shù),默認抽象碘橘,不需要使用abstract
來定義互订。
而抽象類中,可以為定義的變量提供構(gòu)造函數(shù)進行賦值痘拆,而如果沒有賦值的變量需要使用abstract
來定義仰禽,而沒有實現(xiàn)的函數(shù)也需要使用abstract
來定義
接口
Kotlin中的接口可以定義變量,也允許實現(xiàn)函數(shù)體纺蛆。但是不允許有構(gòu)造函數(shù)吐葵,并且抽象函數(shù)也不需要使用abstract
關(guān)鍵字定義。
但是在實現(xiàn)接口的子類中必須使用override
來覆蓋接口中所定義的變量以及抽象函數(shù)桥氏。而提供了get
方法的變量温峭,也就不需要子類實現(xiàn)了。
interface IPerson {
val mName: String
var mAge: Int
val mDump: String
get() = "$mName...$mAge"
fun print() {
Log.e("IPerson", "mName:$mName...mAge:$mAge")
}
fun walk()
}
子類實現(xiàn):
class Child(name: String, age: Int = 18) : IPerson {
// 必須要重載接口中定義的變量
override var mName = name
override var mAge = age
override fun walk() {
Log.e("Child", "Child Walk called:$mName...$mAge")
}
}
抽象類
抽象類中定義的變量如果沒有在構(gòu)造函數(shù)中賦值的話字支,則需要使用abstract
定義凤藏,而函數(shù)也一樣奸忽,如果沒有實現(xiàn),則需要使用abstract
來定義
abstract class AbsPerson(name: String) {
var mName: String = name
abstract var mAge: Int
fun print() {
Log.e("IPerson", "mName:$mName...mAge:$mAge")
}
abstract fun walk()
}
子類實現(xiàn):
open class Child(name: String, age: Int = 18) : AbsPerson(name) {
override var mAge = age
override fun walk() {
Log.e("Child", "Child Walk called:$mName...$mAge")
}
}
繼承
在Kotlin中揖庄,如果沒有定義abstract
的抽象來定義類或者函數(shù)的話栗菜,那么就需要使用open
關(guān)鍵字來定義才允許讓子類繼承或者重載函數(shù)
因為如果沒有使用open
定義的話,則默認會添加final
標志位蹄梢,不可重寫疙筹。
open class Child(name: String, age: Int = 18) : AbsPerson(name) {
override var mAge = age
override fun walk() {
Log.e("Child", "Child Walk called:$mName...$mAge")
}
protected open fun run() {
Log.e("Child", "Child can't Run:$mName...$mAge")
}
}
子類實現(xiàn)
class Teenager(name: String) : Child(name) {
override fun run() {
super.run()
Log.e("Teenager", "Teenager can run:$mName...$mAge")
}
}
其中,
protected
僅僅只代表訪問權(quán)限禁炒,只有子類可以訪問而咆,open
則代表是否可以重寫以及繼承。如果一個普通的類沒有使用open
來定義類和函數(shù)的話齐苛,則無法繼承也無法重寫函數(shù)