斯威夫特初始化规则混乱
规则1斯威夫特初始化规则混乱
如果你的子类没有定义任何指定的初始化程序,它会自动继承其所有的超指定初始化的。
混乱:我在子类中提供了一个指定的初始化器。它的意思是没有超类指定的初始化器会归结为子类。但我仍然需要编写覆盖关键字来提供在子类(这意味着超类指定的init归结为子类)中的任何超类指定的初始化器的实现。规则1说如果我提供了子类指定的初始化程序,那么指定的超类将不会下降。 (如果我们没有提供任何指定的子类的初始化,覆盖仅有意义。)
class Food{
var name : String
init(foodName :String) {
self.name = foodName
}
}
class RecipieIngredient : Food{
var quantity : Int
init(fName :String, quantity :Int) {
self.quantity = quantity
super.init(foodName: fName)
}
override convenience init (foodName :String){
self.init(fName: foodName, quantity: 1)
}
}
这是因为init()不是受保护的方法。所以,如果你在子类中定义了一个init()方法,那么编译器不知道你是指超类的init()方法还是子类。 '覆盖'清除了这一点。
“受保护的方法”是什么意思? Swift没有受保护的访问级别。 'override'关键字不是为了消除方法的歧义 - 只是简单地明确指出你正在提供覆盖,并允许编译器检查超类是否有匹配的声明。 – Hamish
你是对的。我使用了“受保护”一词,因为Swift没有类似的关键字。至于消除歧义,是的。尝试创建任何超类,并使用声明具有相同签名的方法的子类。 – dylanthelion
没有歧义,因为没有歧义。在动态分派调用的情况下,类'vtable在运行时使用以查找正确的实现。在调用静态调度的情况下,编译器只需查找该类型的声明以查找要派发到的实现。 – Hamish
你能提供一个你所指的超类和子类的例子吗?具体而言,你不清楚你在问什么。 –
我添加了代码问题。 @SørenMortensen –