自我总结:
1、父类的指针可以指向子类的对象。
2、OC指针类型的变量有两个:一个是编译时的类型,一个是运行时的类型。执行方法也是先过编译这一关再过执行这一关,就是如果编译时没有的方法,在运行时是调不到这个方法的。例如多态,编译时是父类的方法,运行时执行的是子类的方法,如果子类中有方法父类中没有的,此时就执行不了,会报错。
3、为了解决编译时类型检查的问题,OC提供了一个id类型,程序可以对任何对象或者任何类型的指针变量赋值为id类型的变量,而且使用id类型的变量可以调用给变量实际所指对象的方法。
4、指针变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法,因此,编写OC代码时,指针变量只能调用声明该变量时所用类中包含的方法。例如:NSObject *p = [NSLYX alloc]init];代码定义了一个变量p,则这个p只能调用NSObject类的方法,而不能调用NSLYX类中定义的方法。
开始:OC指针类型的变量有两个:一个是编译时的类型,一个是运行是的类型,编译时的类型由声明该变量时使用的类型所决定,运行时的类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态。
下方程序举例:
程序代码:LYXBase.h
#import <Foundation/Foundation.h> @interface LYXBase : NSObject -(void)test; -(void)base; @end
程序代码:LYXBase.m
#import "LYXBase.h" @implementation LYXBase -(void)base { NSLog(@"父类的一般的base方法"); } -(void)test { NSLog(@"父类的将被覆盖test方法"); } @end
程序代码:LYXSubClass.h
#import "LYXBase.h" @interface LYXSubClass : LYXBase -(void)sub; @end
程序代码:LYXSubClass.m
#import "LYXSubClass.h" @implementation LYXSubClass -(void)test { NSLog(@"子类的重写的test方法"); } -(void)sub { NSLog(@"子类的sub方法"); } @end
程序代码:main.m
// main.m // 多态练习。。 #import <Foundation/Foundation.h> #import "LYXSubClass.h" int main(int argc, const char * argv[]) { @autoreleasepool { 一、 //下面编译时类型和运行时类型完全一样,因此不存在多态 LYXBase *bc = [[LYXBase alloc]init]; //下面两次调用将执行父类的方法 [bc base]; [bc test]; 二、 //下面编译时类型和运行时类型完全一样,因此不存在多态 LYXSubClass *sc = [[LYXSubClass alloc]init]; //相面调用将执行从父类继承的方法 [sc base]; //下面调用将执行子类重写的方法 [sc test]; //下面调用将执行子类定义的方法 [sc sub]; 三、 //下面编译时的类型和运行时的类型不一样,多态发生 LYXBase * ploymophicBc = [[LYXSubClass alloc]init]; //下面调用将执行从父类继承的方法 [ploymophicBc base]; //下调用将执行子类重写的test方法 [ploymophicBc test]; //因为ploymophicBc的编译类型是LYXBase //LYXBase没有提供sub方法,所以下面的代码编译时会出现错误 // [ploymophicBc sub]; //可将任何类型的指针变量赋值给id类型的变量 id dyna = ploymophicBc; //程序可以对任何对象或者任何类型的指针变量赋值为id类型的变量,而且使用id类型的变量可以调用给变量实际所指对象的方法。 [dyna sub]; } return 0; }
输出代码片段:
2016-02-14 15:22:41.854 多态练习。。[3159:942743] 父类的一般的base方法 2016-02-14 15:22:41.854 多态练习。。[3159:942743] 父类的将被覆盖test方法 2016-02-14 15:22:41.854 多态练习。。[3159:942743] 父类的一般的base方法 2016-02-14 15:22:41.854 多态练习。。[3159:942743] 子类的重写的test方法 2016-02-14 15:22:41.854 多态练习。。[3159:942743] 子类的sub方法 2016-02-14 15:22:41.854 多态练习。。[3159:942743] 父类的一般的base方法 2016-02-14 15:22:41.854 多态练习。。[3159:942743] 子类的重写的test方法 2016-02-14 15:22:41.854 多态练习。。[3159:942743] 子类的sub方法 Program ended with exit code: 0