自動繼承初始化程序
Automatic Initializer Inheritance:🤔 一個子類別 (subclass) 何時會繼承母類別 (superclass) 的初始化程序❓
⭐️ 繼承規則
一般來說,subclass 並不會繼承 superclass 的 initializers,但如果符合以下的狀況則會自動繼承:
如果 subclass 為自己所有的屬性 (stored properties) 提供預設值 (default values),這時 superclass initializers 依然可以正常運作,因此 subclass 就會自動繼承所有的 (designated & convenience) initializers。
如果 subclass 定義了自己的屬性但卻沒有給預設值,這時會造成 superclass initializers 不知如何處理這些屬性 (因為 superclass 根本無從得知這些屬性的存在),這時 subclass 就會喪失所有的 superclass initializers。
但如果 subclass 又實作 (implement/override) 了所有的 superclass designated initializers,這時 subclass 又會重新繼承所有的 superclass convenience initializers。

⭐️ 重點整理
如果 subclass 有定義自己的 convenience initializers,則上述的規則依然成立。
在實作 superclass designated initializers 的時候,如果用
override convenience init
的方式,而不是用override init
(override designated initializer) 的方式,可以減少 subclass designated initializers 的數量。 ➡️ convenience override
💈範例
// superclass instance
let p = Person(name: "Tom", age: 20)
print(p.age) // 20
/* subclass instances */
// Student
// ---------------------------------------------
// (o) default values for new properties
// (o) no custom designated inits.
// -> inherits all designated/convenience inits
let s1 = Student(name: "May", age: 17) // inherited designated init
let s2 = Student(name: "Baby") // inherited convenience init
let s3 = Student(seatNo: 23) // custom convenience init
print(s1.seatNo) // 50
print(s2.age) // 0
print(s3.name) // "no name"
// Teacher
// ----------------------------------------------
// (o) default values for new properties
// (x) no custom designated inits.
// (o) implements all superclass designated inits
// -> inherits all superclass convenience inits.
let t1 = Teacher(name: "Joe", age: 35, title: "Dr.") // custom designated init
let t2 = Teacher(name: "Joe", age: 35) // override superclass init
let t3 = Teacher(name: "Babe") // inherited convenience init
print(t1.title) // "Dr."
print(t2.title) // "Mr./Ms."
print(t3.age) // 0
// Master
// -----------------------------------------------
// (x) default values
// -> does not inherit superclass initializers
let m = Master(name: "Sheefu", age: 100, skill: "Kung Fu") // custom designated init
print(m.skill) // "Kung Fu"
🔗 原始碼:Repl.it
Last updated
Was this helpful?