黑马程序员—OC基础--初探“多态”
2015-05-26 14:46
176 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ———
/******************************************
*
今天对 “多态”
进行学习.收获如下:
* 1.如果编译时和运行时类型不一致,就可能出现所谓的多态
*
* 2.1⃣️编译时:由声明的类型决定;2⃣️运行时:由实际赋值类型决定
*
* 3.如果想在多态状态下,调用对象的运行时类型的方法,可以将其:1⃣️复制给id类型,2⃣️将其强制转换为运行时类型。
*
这种强制类型转换只是改变了该指针变量的编译时类型,但该变量所指向对象的实际类型并不会发生任何改变。
*
* 4.判断指针变量的实际类型(一般建议在执行强制转换之前先机型判断):
*
1⃣️-(BOOL) isKindOfClass : clazz
判断是否为clazz或其子类实例
*
2⃣️- (BOOL)isSubclassOfClass : clazz
判断是否为clazz的子类实例
*******************************************/
代码实现:
/******************************************
*
今天对 “多态”
进行学习.收获如下:
* 1.如果编译时和运行时类型不一致,就可能出现所谓的多态
*
* 2.1⃣️编译时:由声明的类型决定;2⃣️运行时:由实际赋值类型决定
*
* 3.如果想在多态状态下,调用对象的运行时类型的方法,可以将其:1⃣️复制给id类型,2⃣️将其强制转换为运行时类型。
*
这种强制类型转换只是改变了该指针变量的编译时类型,但该变量所指向对象的实际类型并不会发生任何改变。
*
* 4.判断指针变量的实际类型(一般建议在执行强制转换之前先机型判断):
*
1⃣️-(BOOL) isKindOfClass : clazz
判断是否为clazz或其子类实例
*
2⃣️- (BOOL)isSubclassOfClass : clazz
判断是否为clazz的子类实例
*******************************************/
代码实现:
#import <Foundation/Foundation.h> /**************************************************************/ @interface LBXYBase : NSObject - (void) base; - (void) test; @end /****************/ @implementation LBXYBase - (void) base { NSLog(@"父类的普通base方法"); } - (void) test { NSLog(@"父类被覆盖的test方法"); } @end /**************************************************************/ /**************************************************************/ @interface LBXYSubclass : LBXYBase - (void) sub; @end /****************/ @implementation LBXYSubclass - (void) sub { NSLog(@"子类的sub方法"); } - (void) test //覆盖了父类的test方法 { NSLog(@"子类覆盖父类的test方法"); } @end /**************************************************************/ int main(int argc, const char * argv[]) { @autoreleasepool { //下面只是正常使用,不发生多态 LBXYBase* bc = [[LBXYBase alloc] init]; [bc base]; [bc test]; LBXYSubclass* sc = [[LBXYSubclass alloc] init]; [sc base]; [sc test]; //和上面的test方法并不相同,这里是覆写的test方法 [sc sub]; NSLog(@"************************************"); //下面编译时和运行时类型不一样,发生多态 LBXYBase* ploymophicBc = [[LBXYSubclass alloc] init]; //出现多态,将LBXYSubclass类型的对象赋值给LBXYBase类型的指针变量,即子类变量赋值给父类指针 [ploymophicBc base]; //ploymophicBc对象,在编译时为LBXYBase类型,运行时为LBXYSubclass类型 [ploymophicBc test]; NSLog(@"****************************使用id类型传递"); // [ploymophicBc sub]; //ploymophicBc运行时为LBXYSubclass类型的对象,但在在编译时为LBXYBase类型的对象,所以调用LBXYSubclass类的sub方法会报错 id dyna1 = ploymophicBc; //解决办法1⃣️:将多态对象赋值给id类型,就能够调用“该对象在运行时类型的任意方法” [dyna1 sub]; NSLog(@"****************************使用强制转换"); if([ploymophicBc isKindOfClass:[LBXYSubclass class]]) //判断ploymophicBc对象是否LBXYSubclass或其子类的实例 { LBXYSubclass* dyna2 = (LBXYSubclass*) ploymophicBc;//解决办法2⃣️:强制转换 [dyna2 sub]; } } return 0; }
相关文章推荐
- 黑马程序员—OC基础--初探 “KVC”
- 黑马程序员 _7 OC基础 继承、多态、分类
- 黑马程序员---OC基础---封装、继承、多态、@property、id类型、实例变量修饰符
- 黑马程序员——OC基础02—封装、继承、多态
- 黑马程序员 OC基础: 面向对象_继承&多态(三)
- 黑马程序员----oc基础笔记----多态
- 黑马程序员——OC语言基础:面向对象三大特性,封装、继承、多态
- 黑马程序员——OC 基础:实例变量修饰符,description方法和多态
- 黑马程序员——OC基础学习(四)---封装,继承和多态的学习知识总结
- 黑马程序员——OC语言基础——面向对象三大特性之多态
- 黑马程序员—OC基础--初探 “KVO”
- 黑马程序员——javase基础--多态、内部类、异常
- 【黑马程序员】【OC语言】多态
- 黑马程序员--ios基础--oc-内存管理之ARC、Block
- 黑马程序员--ios基础--oc-foundation--NSString,NSArray与计算代码行数的练习
- 黑马程序员 _6 OC基础 set get语法与点语法
- 黑马程序员-IOS-OC基础-Foundation
- 黑马程序员_Java基础_面向对象(多态、Object类相关方法)
- 黑马程序员 _8 OC基础 id description sel的使用
- 黑马程序员---Java基础---面向对象:多态、内部类、异常