黑马程序员------OC中的多态

来源:互联网 发布:阿里云搭建服务器 编辑:程序博客网 时间:2024/05/18 09:43

一、基本概念

  多态在代码中的体现,即为某一类事物的多种形态,OC对象具有多态性。必须要有继承,没有继承就没有多态。

  在使用多态时,会进行动态检测,以调用真实的对象方法。

  多态在代码中的体现即父类指针指向子类对象。

 Person *p = [Student new];2 3 p->age = 100;4 5 [p walk];

二、多态使用注意

  1.多态的好处

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

  一、基本概念

  多态在代码中的体现,即为某一类事物的多种形态,OC对象具有多态性。必须要有继承,没有继承就没有多态。

  在使用多态时,会进行动态检测,以调用真实的对象方法。

  多态在代码中的体现即父类指针指向子类对象。

1 Person *p = [Student new];2 3 p->age = 100;4 5 [p walk];

二、多态使用注意

  1.多态的好处

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

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

    void feed(Dog *d)

    {

      [d  eat];

    }

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

    void feed(Cat *c)

    {

      [c  eat];

    }

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

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

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

  2.多态的局限性

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

    不建议的做法:

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

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

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

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

  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个字节。

  提示:字数也包括空格。

四、多态使用实例

#import <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
原创粉丝点击