【发布时间】:2014-08-16 01:34:48
【问题描述】:
我正在尝试像下面这样初始化一个子类:
class NameShape{
var numberOfSide: Int = 0
var name:String
func simpleDescription() -> String {
return "A square with \(numberOfSide) sides."
}
init (name: String){
self.name = name
}
}
class Square:NameShape{
var sideLength: Double
init(name: String, sideLength: Double){
super.init(name: name)
self.sideLength = sideLength
numberOfSide = 4
}
func area() ->Double {
return sideLength * sideLength
}
override func simpleDescription() -> String {
return "A square with sides of length \(sideLength)."
}
}
报错property 'self.sideLength' not initialized at super.init call,于是切换self.sideLength = sideLength和super.init(name: name),如:
class Square:NameShape{
var sideLength: Double
init(name: String, sideLength: Double){
self.sideLength = sideLength
super.init(name: name)
numberOfSide = 4
}
func area() ->Double {
return sideLength * sideLength
}
override func simpleDescription() -> String {
return "A square with sides of length \(sideLength)."
}
}
现在很好,有人可以解释背后的原理吗? 谢谢!!!
【问题讨论】:
-
这似乎是一个非常奇怪的设计决定。从逻辑上讲,在对子类执行任何操作之前初始化基类是有意义的,包括设置属性。这当然是我使用过的所有其他语言的做法,包括 Objective C。
标签: ios macos swift swift-playground