昨天介紹完介面可以讓我們不用透過完整定義類別內容去給出一個模板,使用過其他物件導向語言的讀者應該會說,你的介面(interface
) 可以做出具體函式,那這樣跟抽象類別(abstract class
) 這個物件導向語言的概念有什麼區別?確實,在近期的 Kotlin 版本中在介面中加入了許多其他語言用抽象類別才有的功能模糊了兩者的界線,硬是要說的話差別大概是還剩下(?) 下面兩點
類別可以在定義時實作多個介面,然而只能實作一個抽象類別。
雖然介面可以使用具體函式,但他卻不能有狀態,也就是具體變數,唯一解方就是用 get
韓式讓這個抽象變數可以帶一個函式並返還值;反之抽象類別可以。
interface I {
val property: String
get() = "field"
// val failedProperty: String = "field". // Compiler Error
}
abstract class A {
val property: String = "field". // OK
}
class MyClass : I {
...
}
fun main() {
val testClass = MyClass()
print(testClass.property) // "field"
}
抽象類別可以像一般類別一樣擁有傳入變數,介面不具備這樣的功能。
和介面相同,抽象類別是一個不能直接生成物件的類別,它是只能讓其他類別繼承的模板,用於定義應該在一組相關類別之間共享的通用行為和屬性,同時允許每個子類別依據需求做出實作。
抽象類別是使用 abstract
關鍵字聲明的。它提供了一種方法來定義在抽象類別本身中沒有實現的方法和屬性,但必須在其子類別中實現。抽象類別通常用於當您想要為一組相關的類別創建共同的結構時。
abstract class Shape {
// 抽象屬性,沒有預設值
abstract val area: Double
// 抽象方法,沒有實現
abstract fun calculateArea(): Double
}
除了類別可以做成抽象化外,其實抽象類別內的函式與變數可以使用 abstract
字樣定義成抽象的
area
變數是抽象的,這意味著它必須在 Shape
的任何子類別中被實現。Shape
類別中的 calculateArea()
方法就是一個抽象函式的例子。