2014-06-15 139 views
2

Swift編程語言的示例代碼在第一行中沒有調用super.init。這似乎是一種不安全的做法,因爲繼承的項目可以被父構造器覆蓋,對吧?爲什麼Swift構造函數使用命名參數調用?

class EquilateralTriangle: NamedShape { 
    var sideLength: Double = 0.0 

    init(sideLength: Double, name: String) { 
     self.sideLength = sideLength 
     super.init(name: name) 
     numberOfSides = 3 
    } 

    var perimeter: Double { 
    get { 
     return 3.0 * sideLength 
    } 
    set { 
     sideLength = newValue/3.0 
    } 
    } 

    override func simpleDescription() -> String { 
     return "An equilateral triagle with sides of length \(sideLength)." 
    } 
} 
+0

是的,你是對的。在這種情況下,'sideLenght'將被默認值覆蓋,並且您將失去用戶的輸入。你可以在這裏閱讀更多關於_initlaization_過程的信息:https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Initialization.html – holex

+0

@holex'sideLength'將被* not *覆蓋其默認值。在這種情況下,不需要指定默認值,但當您有多個初始化程序時,可能會派上用場,其中有些程序不需要知道「sideLength」。 –

回答

2

在初始化你必須調用super.init()之前做好充分準備的對象。這意味着,當您調用初始化程序的超級實現時,子類聲明的所有屬性都需要有一個值。

在調用super.init()之後,您可能會覆蓋從超類繼承的屬性。 numberOfSides是繼承的屬性,因此在調用超級實現後被覆蓋
numberOfSides =self.numberOfSides =在這個例子中是等價的。

爲了把事情短:在子類中聲明
1.屬性必須在調用super.init()
2.繼承屬性必須調用super.init()

之後被覆蓋之前設置的編譯器將拋出一個錯誤對於第一種情況,但我不確定後者。

+0

這似乎是錯誤的,因爲不應要求兒童班級知道家長的情況。所以父母可以重寫孩子的性質似乎是違反直覺的。 – Boon

+0

我不明白你的問題,對不起。父級不能覆蓋子級屬性。你指的是什麼? –

+1

對不起,我誤解了你的觀點1 - 「在調用super.init之前必須設置子類聲明的屬性」。在super.init之前必須先準備好所有的子類屬性的基本原理是什麼? – Boon

相關問題