iOS基础(oc)-多态

------知之博客 期待与您交流! -------

一 基本概念

多态在代码中的体现,即为某一类事物的多种形态,OC对象具有多态性。必须要有继承,没有继承就没有多态。在使用多态时,会进行动态检测,以调用真实的对象方法。多态在代码中的体现即父类指针指向子类对象。

  Person *p = [Student new];
  p->age = 100;
  [p walk];

二 多态使用注意

  1.多态的好处

    用父类接收参数,节省代码 

    需要一个新的函数专门用来喂狗

    void feed(Dog *d)

    {

      [d  eat];

    }

    如果这个时候也需要喂猫,那就应该重写新一个新的函数

    void feed(Cat *c)

    {

      [c  eat];

    }

    而狗和猫实际上都继承自动物这个类,在这里就可以使用多态来简化代码了。

    这里只需要把函数的参数写成是Animal *类型的,那么Dog和Cat类型的对象就都可以传入进来。

    调用的时候直接改变参数就可以了。

  2.多态的局限性

     不能访问子类的属性(可以考虑强制转换)

    不建议的做法:

    Animal *a=[[Dog alloc] init];

    [a run]; // 在Animal类中没有run方法,这里调用了狗对象的方法。

    解决方法:可以将a强制转换为Dog*类型的变量,如下:

    Dog *d=(Dog *)a; // 使用强制转换,这里a和d指向的是同一个狗对象

  3.多态的细节

    动态绑定:在运行时根据对象的类型确定动态调用的方法

三、NSString的简单使用

  #import <Foundation/Foundation.h>

  @interface Person : NSObject
  {
    //char *_name;
    NSString *_name;
  }
  @end

  int main()
  {
    /*
    // 最简单的创建字符串的方式
     NSString *str = @"itcast";
    
   char *name = "itcast";
     
    
    NSLog(@"我在%@上课", str);
    //NSLog(@"%s", name);
    */
    
    int age = 15;
    int no = 5;

   NSString *name = @"哈哈jack";

   // length方法算的是字数
     int size = [name length];
   
   NSLog(@"%d", size);
    
    // 创建OC字符串的另一种方式
  NSString *newStr = [NSString stringWithFormat:@"My age is %d and no is %d and name is %@", age, no, name];
     
    NSLog(@"---- %ld", [newStr length]);
    
    return 0;
  }

  注意:字符串对象的length方法:计算的是字符串的字数,而不是像strlen函数那样,计算的是字符数。如“哈ha123”length得出的结果是6,返回unsigned long类型,而strlen函数得出的结果是8,因为一个汉字占3个字节。提示:字数也包括空格。

四、多态使用实例

 

  #mport <Foundation/Foundation.h>
 
  // 动物
  @interface Animal : NSObject
  - (void)eat;
  @end
 
  @implementation Animal
  - (void)eat
  {
     NSLog(@"Animal-吃东西----");
  }
  @end
  
  // 狗
  @interface Dog : Animal
  - (void)run;
  @end
  
  @implementation  Dog
  - (void)run
  {
     NSLog(@"Dog---跑起来");
  }
  - (void)eat
  {
      NSLog(@"Dog-吃东西----");
  }
  @end
 
  // 猫
  @interface Cat : Animal
 
  @end
  
  @implementation Cat
  - (void)eat
  {
     NSLog(@"Cat-吃东西----");
  }
  @end
  
  // 如果参数中使用的是父类类型,可以传入父类、子类对象
  void feed(Animal *a)
  {
     [a eat];
  }
 
  int main()
  {
      NSString *d = [Cat new];
      [d eat];
      
      /*
     Animal *aa = [Dog new];
     // 多态的局限性:父类类型的变量 不能 用来调用子类的方法
      //[aa run];
      
      // 将aa转为Dog *类型的变量
      Dog *dd = (Dog *)aa;
     
      [dd run];
      */
      
     //Dog *d = [Dog new];
     
     //[d run];
      
      /*
      Animal *aa = [Animal new];
      feed(aa);
     
     Dog *dd = [Dog new];
     feed(dd);
     
     Cat *cc = [Cat new];
      feed(cc);
       */
     
      /*
     // NSString *s = [Cat new];
     Animal *c = [Cat new];
      
      
     NSObject *n = [Dog new];
     NSObject *n2 = [Animal new];
    
      // 多种形态
      //Dog *d = [Dog new]; // Dog类型
      
      // 多态:父类指针指向子类对象
     Animal *a = [Dog new];
      
      // 调用方法时会检测对象的真实形象
      [a eat];
      */
     return 0;
  }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值