巢狀類別和內部類別
巢狀類別和內部類別是兩種類別組織方式,它們允許你將一些相關的類別放在其他類別內部,以此來提高程式碼的結構清晰度和封裝性。
巢狀類別
巢狀類別是在另一個類別內部定義的類別。
巢狀類別不能直接訪問外部類別的成員,因為它們不持有外部類別的物件。
在這個例子中,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
巢狀類別與內部類別的選擇
- 使用巢狀類別:當你需要一個不需要訪問外部類別成員的類別時,或者當你希望該類別可以獨立於外部類別物件存在時。
- 使用內部類別:當類別與其外部類別有強烈的依賴關係,並需要訪問外部類別的成員時。