黑马程序员技术交流社区

标题: [笔记] OC的多态 [打印本页]

作者: 蜡笔小炎    时间: 2015-5-25 20:54
标题: [笔记] OC的多态
  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;
复制代码




作者: 追随自然    时间: 2015-5-25 21:04
多谢分享!

作者: 这是829    时间: 2015-5-25 21:12
围观学习啦
作者: 七尺阳光    时间: 2015-5-25 21:17
不错 学习一下...
作者: mony    时间: 2015-5-26 09:18
赞一个...........
作者: 小龙女的萝卜    时间: 2015-5-26 11:29
围观学习下,谢谢分享交流
作者: wwwwjay    时间: 2015-5-26 15:09
围观学习,谢谢分享!!!1




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2