2016-03-10 55 views
0

我是學下面的章節中的斯威夫特編程語言:斯威夫特繼承v.s調用超級

如果你的子類沒有定義任何指定的初始化程序,它會自動繼承其所有的超指定初始化的。

然後我在目標試過這些代碼:

class Car { 
    var name: String = "Unknown" 
    init(name: String) { 
     self.name = name 
    } 
} 
class RacingCar: Car { 
    var speed = 0.0 
    init(name: String, speed: Double) { 
     self.speed = speed 
     super.init(name: name)//this is where I got confused 
    } 
} 

根據規則之一,RacingCar類將不繼承自其超汽車在init(名稱:)指定的初始化。不過,我仍然可以在我的子類中調用super.init(name :)。這怎麼會發生?我對此很困惑。誰能解釋爲什麼?謝謝。

回答

1

繼承初始化程序意味着初始化程序可用於子類(這就是繼承的含義)的實例;也就是說,你的子類初始化可以調用它self

class RacingCar: Car { 
    var speed = 0.0 
    init(name: String, speed: Double) { 
     self.speed = speed 
     self.init(name: name) // <-- Error: This initializer is not inherited 
    } 
} 

你並不需要繼承的初始化調用它super:超類沒有失去其初始的訪問,只是因爲你的子類的。

class RacingCar: Car { 
    var speed = 0.0 
    init(name: String, speed: Double) { 
     self.speed = speed 
     super.init(name: name) // <-- Works: super class does have this initializer 
    } 
} 
+0

謝謝您的幫助。這是有道理的,但我仍然有一個問題。在超類中定義的所有方法和屬性可用於子?@NicolasMiari – Evan

+0

是的,除非它們被聲明爲'private'。但即便如此,他們如果兩個超和子類在同一個文件中定義仍然可用(以快捷,訪問控制是源文件爲基礎的) –

+0

有關於特殊規則** **初始化(就像你在你的問題提) ,但其他方法會自動繼承。 –