You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子类有指定初始化器时,能否继承父类的便利初始化器?

问题解答

1. 为什么B(ageString: "1")会报错?

核心原因是子类自定义指定初始化器后,默认不会继承父类的便利初始化器。

Swift的初始化继承规则明确:当子类定义了自己的指定初始化器时,就失去了自动继承父类指定初始化器的资格;而父类的便利初始化器只有在子类实现了父类所有指定初始化器(不管是自己写的还是继承来的)的前提下,才会被继承。

你的B类自定义了指定初始化器init(name:),但完全没实现父类A的指定初始化器init(age:),所以父类扩展里的init?(ageString:)这个便利初始化器不会被B继承,自然调用时会提示初始化器不存在。

2. 扩展中能不能定义非便利初始化器?

不行,Swift不允许在类的扩展中添加指定初始化器,只能定义便利初始化器。指定初始化器必须放在类的主定义(也就是class A { ... }的大括号中)声明,扩展只能用来给类添加便利初始化器、方法、计算属性等内容。

3. 子类有指定初始化器时,不会继承父类的便利初始化器吗?

是的,默认不会,除非满足以下两个条件之一:

  • 子类实现了父类所有的指定初始化器(不管是自己编写的,还是通过继承得到的);
  • 子类被标记为final类(无法被继承的类)。

你的B类既没实现父类的init(age:),也不是final类,所以父类的便利初始化器不会被继承。


内容的提问来源于stack exchange,提问作者xarly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:39:55