Kotlin教學 | 從零開始學Kotlin | Kotlin入門 | CH12: 巢狀類別(Nested)和內部類別(Inner)

巢狀類別和內部類別

巢狀類別和內部類別是兩種類別組織方式,它們允許你將一些相關的類別放在其他類別內部,以此來提高程式碼的結構清晰度和封裝性。

巢狀類別

巢狀類別是在另一個類別內部定義的類別。
巢狀類別不能直接訪問外部類別的成員,因為它們不持有外部類別的物件。

在這個例子中,Nested 是一個巢狀類別,它定義在 Outer 類別內部,但它不能訪問 Outer 的私有成員 bar

class Outer {
    private val bar: Int = 1
    class Nested {
        fun foo() = 2
    }
}

val demo = Outer.Nested().foo() // 返回 2

巢狀介面

你也可以在類別中巢狀介面。
所有的組合都是可能的:介面中巢狀類別和介面。

interface OuterInterface {
    class InnerClass
    interface InnerInterface
}

class OuterClass {
    class InnerClass
    interface InnerInterface
}

內部類別

將巢狀類別標記為 inner,它就會變成一個內部類別。
與巢狀類別不同,內部類別持有外部類別的物件。
因此:

  • 內部類別可以訪問外部類別的成員。
  • 要創建內部類別的物件,你需要先有外部類別的物件。
class Outer {
    private val bar: Int = 1
    inner class Inner {
        fun foo() = bar
    }
}

val outerInstance = Outer() //要創建內部類別的物件,你需要先有外部類別的物件。
val demo = outerInstance.Inner().foo() // 返回 1

巢狀類別與內部類別的選擇

  • 使用巢狀類別:當你需要一個不需要訪問外部類別成員的類別時,或者當你希望該類別可以獨立於外部類別物件存在時。
  • 使用內部類別:當類別與其外部類別有強烈的依賴關係,並需要訪問外部類別的成員時。

Reference

https://kotlinlang.org/docs/nested-classes.html

發佈留言