在下面的代码中,我的目的是在基类中声明repeatNum
,因为它在基类中使用(在init
内部和其他函数中)。每个子类都应设置repeatNum
,因为只有子类知道自己的值。
class Base {
var repeatNum: Int
init() {
for var i=0; i<repeatNum; ++i {
print("*")
}
}
}
class SubClass1 : Base {
override init() {
repeatNum = 10
super.init()
}
}
class SubClass2 : Base {
override init() {
repeatNum = 5
super.init()
}
}
当然,它会引发一些错误:
对于基类:
'self.repeatNum'未初始化
从初始化程序返回,而不启动所有存储的属性。
对于子类:
在super.init初始化self
之前,在属性访问'repeatNum'中使用'self'
我知道我可以在子类中设置super.init()
之前简单地调用repeatNum
,但我确实需要在实际情况下在基数repeatNum
内使用init()
。在某种程度上,这对我来说是一个悖论。
我也理解我可以改变设计以使错误消失,但我想知道是否可以通过一些调整实现我的初衷?我可能在这里想念一些东西。
答案 0 :(得分:4)
您当前的代码甚至无法编译,是吗?它应该抱怨在初始化之前尝试使用repeatNum
...
也许这样的事情可能适合你?
class Base {
var repeatNum: Int
init(repeatNum: Int) {
self.repeatNum = repeatNum
for _ in 0..<repeatNum {
print("*")
}
}
}
class SubClass1 : Base {
init() {
super.init(repeatNum: 10)
}
}
class SubClass2 : Base {
init() {
super.init(repeatNum: 5)
}
}
答案 1 :(得分:0)
我不知道你想要什么,以下代码就是好的
class Base {
var repeatNum: Int?
init() {
}
func printyourneed(){
for var i=0; i<repeatNum; ++i {
print("*")
}
}
}
class SubClass1 : Base {
override init() {
super.init()
self.repeatNum = 10
self.printyourneed()
}
}
class SubClass2 : Base {
override init() {
super.init()
self.repeatNum = 5
self.printyourneed()
}
}
或
class Base {
var _repeatNum:Int?;
var repeatNum: Int?{
get{
return _repeatNum
}
set{
_repeatNum = newValue
printyourneed()
}
}
init() {
}
func printyourneed(){
for var i=0; i<repeatNum; ++i {
print("*")
}
}
}
class SubClass1 : Base {
override init() {
super.init()
self.repeatNum = 10
}
}
class SubClass2 : Base {
override init() {
super.init()
self.repeatNum = 5
}
}