多态

来源:互联网 发布:网页美工视频教程 编辑:程序博客网 时间:2024/06/08 06:28

自我总结:

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;}

上方一、二都很正常。但是三中ploymophicBc编译时类型是父类的,而运行时类型是子类的,当运行时调用test方法时(父类定义了该方法,子类重写了父类的方法),实际执行子类重写的方法,这就可能出现多态。当运行时调用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] 父类的一般的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


3 0
原创粉丝点击