Ios 子类是否继承初始值设定项?
我有以下代码:Ios 子类是否继承初始值设定项?,ios,swift,inheritance,Ios,Swift,Inheritance,我有以下代码: class Parent { var foo: Int init(someNum: Int) { self.foo = someNum } } class Child: Parent { } var parent = Parent(someNum: 999) println(parent.foo) // prints "999" var child = Child(someNum: 3872)
class Parent {
var foo: Int
init(someNum: Int) {
self.foo = someNum
}
}
class Child: Parent {
}
var parent = Parent(someNum: 999)
println(parent.foo) // prints "999"
var child = Child(someNum: 3872)
println(child.foo) // prints "3872"
在苹果公司2014年的WWDC“Intermediate Swift”视频中,他表示,除非其存储属性有默认值,否则初始值设定项不会默认继承。但是,子类Child
中没有foo
的默认值,但它显然继承了init(someNum:)
方法。我理解的解释是错误的还是有其他原因?来自苹果文档:
默认情况下,子类不继承其超类初始值设定项。
但是,如果
满足某些条件。实际上,这意味着您不需要
需要在许多常见场景中编写初始值设定项重写,并且可以
继承超类初始值设定项时,尽可能不费力
这样做是安全的
假设您为您创建的任何新属性提供默认值
在子类中引入以下两条规则:
规则1如果子类未定义任何指定的初始值设定项,则
自动继承其所有超类指定的初始值设定项
规则2
如果您的子类提供了其所有
超类指定初始值设定项,方法是根据
规则1,或者通过提供自定义实现作为其
然后它自动继承所有的超类
方便初始化器
即使您的子类增加了更多的便利性,这些规则仍然适用
初始化者
在您的情况下,您没有在Child
中提供任何指定的初始值设定项。因此,只有一个指定的初始值设定项是从父级继承的
如果将子类修改为:
class Child : Parent {
var age : Int
init (age : Int) {
self.age = age
super.init(foo: 10)
}
}
您将看到,无法通过调用超类初始值设定项来创建子类。
编辑:
上述规则适用于更不同的场景。也许这些文件让你有点困惑,但让我们停下来想一想。您有一个子类继承自一个超类,该超类有一个属性foo
。现在,如果您的子类没有添加任何属性,或者添加了带有默认值的属性,则不需要与超类中的初始值设定项不同的初始值设定项,因此您可以安全地使用它。另一方面,如果添加的属性没有默认值,则无法使用超类中的初始值设定项,因为添加的属性需要以某种方式初始化。编译器会抱怨,您必须执行以下两项操作之一:
您应该在子类中实现一个指定的初始值设定项,该初始值设定项将分配新属性,并在超类中调用指定的初始值设定项
您可以向属性中添加默认值,并且仍然可以使用超类中指定的初始值设定项
如果子类中有任何新属性的默认值,则这些规则适用。但是,我没有在Child
类中提供任何默认值;它是空的,所以规则不应该适用,是吗?更新了我的答案。希望现在一切都清楚了。啊“…为您引入的任何新属性提供默认值…”因此,由于我没有引入任何新属性,因此可以安全地继承初始值设定项。下次我真的应该更仔细地阅读。Swift中的规则看起来非常复杂和困难,直到你仔细思考它们,然后你发现它们绝对正确,需要这样做。