Swift难点-继承中的构造规则实例详解
来源:互联网 发布:江汉大学网络支付平台 编辑:程序博客网 时间:2024/06/07 07:16
转自: http://blog.csdn.net/hello_hwc/article/details/41276359
如有侵犯,请来信oiken@qq.com
关于继承中的构造规则是一个难点。
我的Swift入门教程专栏
http://blog.csdn.net/column/details/swfitexperience.html
为什么要有构造器:为类中自身和继承来的存储属性赋初值。
一、两种构造器-指定构造器和便利构造器
指定构造器:类中必备的构造器,为所有的属性赋初值。(有些子类可能不需要显示声明,因为默认从基类继承了)
便利构造器:类中的辅助构造器,通过调用指定构造器为属性赋初值。(仅在必要的时候声明)
举例
何为代理:就是让别人帮你干活
二、构造过程中的规则
(一)构造器链就是调用构造器的顺序
规则如下:
1.1、指定构造器必须调用其父类的指定构造器
1.2、便利构造器必须调用同一类中的指定构造器
1.3、便利构造器必须最后以调用一个指定构造器而结束
总得来说一句话:便利构造器横向代理,指定构造器向上代理。
举个例子:
(二)关于构造器的继承与重载
swift中,子类不会默认继承父类的构造器。
构造器的重载遵循构造器链的规则(1.1-1.3)
构造器的继承规则如下:
2.1、如果子类中没有定义任何指定构造器,将会自动继承所有父类的指定构造器
2.2、如果子类中提供了所有父类指定构造器,不管是通过规则2.1继承来的,还是自定义实现的,它将继承所有父类的便利构造器。
注意:子类可以通过部分满足规则2.2的方式,使用子类便利构造器来实现父类的指定构造器。
例子一:
这里子类没有定义任何构造器,所以满足规则2.1,2.1,将继承所有父类的指定构造器和便利构造器
所以可以这么调用
例子二
这里,子类只是实现了父类的一个构造器,所以并未继承便利构造器,也没有继承另外一个指定构造器
只可以这么创造实例
(三)基于上述两个规则,构造过程分为两个部分
阶段一
- 某个指定的构造器或者便利构造器被调用;
- 完成新实例的内存分配(此时内存尚未初始化);
- 指定构造器确保其引入的所有存储属性已经赋值(存储属性极其所属内存完成初始化);
- 指定构造器调用父类构造器(父类构造器属性初始化);
- 这个调用父类的构造器沿着构造器链一直向上,直到最顶部。(确保所有的继承的基类过程都已经初始化)。
- 从顶部一直向下,每个构造器链中类指定的构造器都有机会进一步定制实例,构造器此时可以访问self,修改它的属性并且调用实例方法等等。
- 最终,任意构造器的便利构造器将有机会定制实例和使用self。
总得来说:当类的实例的内存被初始化完成,也就是调用super.init()之后,就完成了阶段一了。
三、编译器的安全检查
检查一
指定构造器必须在它所在类的属性先初始化完成后才能把构造任务向上代理给父类中的构造器。简单来说,就是先初始化自己的存储属性,在调用父类的super.init向上初始化
检查二
指定构造器必须先向上调用父类构造器,在为继承来的属性赋初值。这个很简答,假设继承来个x,你先为x赋值为1了,而在调用父类构造器,父类构造器会为x赋另外一个初值来保证初始化过程完成,那么你赋值的1就被覆盖了
检查三
便利构造器先调用同类中其他构造器,再为任意属性赋初值。和检查二类似,也是防止被覆盖
检查四
构造器在第一阶段完成之前,不能饮用self,不能调用任何实例属性,不能调用实例方法
四、总结一下
指定构造器的过程是这样的
1、为自己的属性赋初值
2、调用基类构造器(super.init)
3、然后就可以调用self,和实例方法,存储属性。定制新的值了。
然后,我们看下官方文档里给出的一个比较好的例子
这个构造器链的关系如图
解释
- 基类Food定义了一个指定构造函数和一个便利构造器
- 子类RecipeIngredient实现了基类Food所有的指定构造器,所以它继承了基类的便利构造器
- 子类ShoppingListItem没有定义构造器,所以继承了基类RecipeIngredient的所有构造器。Swift入门系列15-继承中的构造规则(难点)
0 0
- Swift难点-继承中的构造规则实例详解
- 新的Swift难点-继承中的构造规则实例详解
- Swift难点-继承中的构造规则实例详解
- java类继承中的构造方法实例详解
- java基础:继承中的构造方法规则
- [绍棠_swift] Swift中的继承、构造器
- Swift中的构造函数及其继承
- Swift之继承、构造过程
- 【继承】----子父类中的构造函数,子类的实例化过程
- Swift中的构造方法
- Swift中的构造方法
- C#中的继承规则
- Swift构造器需要遵循的规则
- 继承中的构造方法
- 继承中的构造方法
- 继承中的构造方法
- 继承中的构造方法
- 继承中的构造方法
- 类小结2:子类对象和父类对象的转换 final关键字 抽象类
- 不要在JS中使用连等赋值操作
- unknown generic error问题解决办法
- VB语言COM组件开发GUID指定方法
- Linux 系列(四)——Redis 集群运维及java整合
- Swift难点-继承中的构造规则实例详解
- 《图解HTTP》学习笔记(五)-与HTTP协作的Web服务器
- Python中的字符编码问题
- nyoj 1058 部分和问题
- C++ Socket编程之小试牛刀
- 第六次作业
- 类小结3: 接口 内部类
- hdu 1686 Oulipo -- (KMP模板题)
- LSD-FET430UIF仿真器问题