2017-03-04 34 views
2

规则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) 
    } 
} 
+0

你能提供一个你所指的超类和子类的例子吗?具体而言,你不清楚你在问什么。 –

+0

我添加了代码问题。 @SørenMortensen –

回答

-2

这是因为init()不是受保护的方法。所以,如果你在子类中定义了一个init()方法,那么编译器不知道你是指超类的init()方法还是子类。 '覆盖'清除了这一点。

+0

“受保护的方法”是什么意思? Swift没有受保护的访问级别。 'override'关键字不是为了消除方法的歧义 - 只是简单地明确指出你正在提供覆盖,并允许编译器检查超类是否有匹配的声明。 – Hamish

+0

你是对的。我使用了“受保护”一词,因为Swift没有类似的关键字。至于消除歧义,是的。尝试创建任何超类,并使用声明具有相同签名的方法的子类。 – dylanthelion

+0

没有歧义,因为没有歧义。在动态分派调用的情况下,类'vtable在运行时使用以查找正确的实现。在调用静态调度的情况下,编译器只需查找该类型的声明以查找要派发到的实现。 – Hamish