Swift 编程语言的示例代码不会在第一行调用 super.init。这似乎是一种不安全的做法,因为继承的项可以被父构造函数覆盖,对吗?
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)."
}
}
最佳答案
在初始化程序中,您必须在调用 super.init()
之前完全准备好对象。这意味着在调用初始化器的 super 实现时,子类声明的所有属性都需要有一个值。
调用super.init()
后,您可以覆盖从父类(super class)继承的属性。 numberOfSides
是一个继承的属性,因此它在调用 super 实现之后被覆盖。
numberOfSides =
和 self.numberOfSides =
在此示例中是等效的。
简而言之:
1. 子类声明的属性必须在调用super.init()
之前设置
2. 调用super.init()
后必须覆盖继承的属性
对于第一种情况,编译器会抛出错误,但我不确定后者。
关于swift - 为什么 Swift 构造函数使用命名参数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24231401/