A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蜡笔小炎 中级黑马   /  2015-5-25 20:54  /  1255 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /******************************************
  2. *      今天对 “多态” 进行学习.收获如下:
  3. *  1.如果编译时和运行时类型不一致,就可能出现所谓的多态
  4. *
  5. *  2.1⃣️编译时:由声明的类型决定;2⃣️运行时:由实际赋值类型决定
  6. *
  7. *  3.如果想在多态状态下,调用对象的运行时类型的方法,可以将其:1⃣️复制给id类型,2⃣️将其强制转换为运行时类型。
  8. *      这种强制类型转换只是改变了该指针变量的编译时类型,但该变量所指向对象的实际类型并不会发生任何改变。
  9. *
  10. *  4.判断指针变量的实际类型(一般在执行强制转换之前先进行判断):
  11. *      1⃣️-(BOOL) isKindOfClass : clazz        判断是否为clazz或其子类实例
  12. *      2⃣️- (BOOL)isSubclassOfClass : clazz    判断是否为clazz的子类实例

  13. Date: 2015/5/12
  14. *******************************************/

  15. #import <Foundation/Foundation.h>
  16. /**************************************************************/
  17. @interface LBXYBase : NSObject

  18. - (void) base;
  19. - (void) test;

  20. @end
  21. /****************/
  22. @implementation LBXYBase

  23. - (void) base
  24. {
  25.     NSLog(@"父类的普通base方法");
  26. }

  27. - (void) test
  28. {
  29.     NSLog(@"父类被覆盖的test方法");
  30. }

  31. @end
  32. /**************************************************************/

  33. /**************************************************************/
  34. @interface LBXYSubclass : LBXYBase

  35. - (void) sub;

  36. @end
  37. /****************/
  38. @implementation LBXYSubclass

  39. - (void) sub
  40. {
  41.     NSLog(@"子类的sub方法");
  42. }

  43. - (void) test           //覆盖了父类的test方法
  44. {
  45.     NSLog(@"子类覆盖父类的test方法");
  46. }

  47. @end
  48. /**************************************************************/


  49. int main(int argc, const char * argv[])
  50. {
  51.     @autoreleasepool
  52.     {
  53.     //下面只是正常使用,不发生多态
  54.         LBXYBase* bc = [[LBXYBase alloc] init];
  55.         [bc base];
  56.         [bc test];
  57.         LBXYSubclass* sc = [[LBXYSubclass alloc] init];
  58.         [sc base];
  59.         [sc test];  //和上面的test方法并不相同,这里是覆写的test方法
  60.         [sc sub];
  61.         NSLog(@"************************************");
  62.         
  63.     //下面编译时和运行时类型不一样,发生多态
  64.         LBXYBase* ploymophicBc = [[LBXYSubclass alloc] init]; //出现多态,将LBXYSubclass类型的对象赋值给LBXYBase类型的指针变量,即子类变量赋值给父类指针
  65.         [ploymophicBc base];    //ploymophicBc对象,在编译时为LBXYBase类型,运行时为LBXYSubclass类型
  66.         [ploymophicBc test];
  67.         
  68.         NSLog(@"****************************使用id类型传递");
  69.         
  70.     //  [ploymophicBc sub];   //ploymophicBc运行时为LBXYSubclass类型的对象,但在在编译时为LBXYBase类型的对象,所以调用LBXYSubclass类的sub方法会报错
  71.         id dyna1 = ploymophicBc; //解决办法1⃣️:将多态对象赋值给id类型,就能够调用“该对象在运行时类型的任意方法”
  72.         [dyna1 sub];
  73.         
  74.         NSLog(@"****************************使用强制转换");
  75.         
  76.         if([ploymophicBc isKindOfClass:[LBXYSubclass class]])   //判断ploymophicBc对象是否LBXYSubclass或其子类的实例
  77.         {
  78.             LBXYSubclass* dyna2 = (LBXYSubclass*) ploymophicBc;//解决办法2⃣️:强制转换
  79.             [dyna2 sub];
  80.         }
  81.         
  82.     }
  83.     return 0;
复制代码



6 个回复

倒序浏览
多谢分享!
回复 使用道具 举报
围观学习啦
回复 使用道具 举报
不错 学习一下...
回复 使用道具 举报
赞一个...........
回复 使用道具 举报
围观学习下,谢谢分享交流
回复 使用道具 举报
围观学习,谢谢分享!!!1
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马