Objective-C编程全解(第3版)3.4 继承和方法调用_Objective-C编程全解(第3版)3.4 继承和方法调用试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > Objective-C编程全解(第3版) > 3.4 继承和方法调用

Objective-C编程全解(第3版)——3.4 继承和方法调用

3.4.1 使用 self 调用方法 如果想在一个方法中调用当前类中定义的方法,可以利用 self。但如果存在继承关系,通过 self 调用方法时要格外注意。 在图 3-6 的例子中,有三个类 A、B、C。类 A 中定义了 method1、method2 和 method3 三个方法。 类 B 继承了类 A,重写了 method1 和 method3。类 C 继承了类 B,重写了 method2。 假设类 B 的方法 method3 想调用 method1 和 method2,通过 self 调用了 method1 和 method2。我 们来分析一下这个过程中到底哪个函数被调用了。对类 B 的实例对象调用 method3 方法时,首先会 通过 self 调用 method1,这个 method1 就是类 B 自身定义的 method1。接着,method3 通过 self 调用 method2,因为类 B 中并没有 method2 的定义,所以就会调用从类 A 中继承而来的 method2。 而如果是类 C 的实例对象调用方法 method3 的话会怎么样呢?我们首先来看看 method3,因为 类 C 中并没有定义 method3,所以调用的是类 B 中定义的 method3。要注意这个时候 self 指的是类 C 的实例对象,当 [self method1] 执行时,因为类 C 中没有定义 method1,所以调用的是类 B 中 定义的 method1。然后,当 [self method2] 执行时,因为类 C 中定义了 method2,所以执行的是 类 C 中定义的 method2,而不是上例中类 A 中定义的 method2。另外还有一点需要注意,就算类 B 中定义了 method2,调用的也是类 C 中定义的 method2。 也就是说,self指的是收到当前消息的实例变量,因此,就算是同一个程序,根据实例的类的不 同,实际调用的方法也可能不相同。 使用 self 的时候要一定小心,要仔细分辨到底调用了哪个类的方法。即便如此,利用 self 的特 性来编程也是很常见的,更多详细内容请参考 11.1 节的内容。 3.4.2 使用 super 调用方法 而如果不使用 self 而使用 super,程序执行的结果会怎样呢? 图 3-7 是用 super 替代图 3-6 中的 self 的情况。使用 super 调用方法时,最后被调用的方法是类 B 的父类中定义的方法。所以无论是类 B 还是类 C 的实例变量调用了 method3,最后调用到的都是类 A 中定义的 method1 和 method2。 super 调用的是父类的方法,而至于到底调用了哪个方法则是由编译时类的继承关系决定的。 3.4.3 测试程序 我们用一个简单的程序来验证一下上面所描述的内容。这个程序本身并没有太大的意义,仅仅 是用来测试方法调用的。 测试程序中有三个类 A、B、C。类 A 中定义了方法 method1 和 method2。类 B 中对 method1 进 行了重写,通过 self 调用了 method1,通过 super 调用了 method2。类 C 重写了 method1。 代码清单 3-6 文件 testself.m #import<Foundation/NSObject.h> #import<stdio.h> @interfaceA:NSObject -(void)method1; -(void)method2; @end @implementationA -(void)method1{printf("method1ofClassAn");} -(void)method2{printf("method2ofClassAn");} @end @interfaceB:A -(void)method2; @end @implementationB -(void)method2{ printf("method2ofClassBn"); printf("self-->"); [selfmethod1]; printf("super-->"); [supermethod2]; } @end @interfaceC:B -(void)method1; @end @implementationC -(void)method1{printf("method1ofClassCn");} @end intmain(void) { idx=[[Balloc]init]; idy=[[Calloc]init]; printf("---instanceofB---n"); [xmethod1]; [xmethod2]; printf("---instanceofC---n"); [ymethod1]; [ymethod2]; return0; } 程序执行之后输出如下。可以看出,类 B 和类 C 的实例分别调用了不同的方法。 ---instanceofB--- method1ofClassA method2ofClassB self-->method1ofClassA super-->method2ofClassA ---instanceofC--- method1ofClassC method2ofClassB self-->method1ofClassC super-->method2ofClassA

展开全文

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《Objective-C编程全解(第3版)》其他试读目录

• 3.1 继承的概念
• 3.2 利用继承定义新类
• 3.3 使用继承的程序示例
• 3.4 继承和方法调用 [当前]
• 3.5 方法定义时的注意事项
• 专栏:Objective-C 与开源软件
• 19.1 多线程
• 19.2 互斥