Swift Programming Language的示例代码不会在第一行调用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)."
}
}
答案 0 :(得分:2)
在初始化程序中,您必须在调用super.init()
之前完全准备对象。这意味着在调用初始化程序的超级实现时,子类声明的所有属性都需要有一个值。
调用super.init()
后,您可能会覆盖从超类继承的属性。 numberOfSides
是一个继承的属性,因此在调用超级实现后它被覆盖。
在此示例中,numberOfSides =
和self.numberOfSides =
是等效的。
简而言之:
1.必须在调用super.init()
之前设置子类声明的属性
2.调用super.init()
编译器会为第一种情况引发错误,但我不确定后者。