[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第九章 多态,动态类型和动态绑定

Part 1. 多态:相同的名称,不同的类

  • 多态:使不同的类共享相同方法名称的能力称为多态。(可以开发一组可以相应相同方法名的类)
        //两个分数
        Fraction *f1 = [[Fraction alloc] init]; 
        Fraction *f2 = [[Fraction alloc] init];        

        Fraction *fracResult; //存储分数相加的结果

        //两个复数
        Complex *c1 = [[Complex alloc] init];
        Complex *c2 = [[Complex alloc] init];

        Complex *compResult;  //存储复数相加的结果

        //给分数赋值
        [f1 setTo:1 over:10];
        [f2 setTo:2 over:15];

        //给复数赋值
        [c1 setReal:18.0 andImaginary:2.5];
        [c2 setReal:-5.0 andImaginary:3.2];


        fracResult = [f1 add: f2];//分数的相加
        compResult = [c1 add: c2];//复数的相加 add: 相同的方法名,

        [fracResult print]; 
  • 及时方法名相同,系统会追踪对象属于的类,因为系统总是携带有关“一个对象属于哪个类”的信息

Part 2. 动态绑定和id类型

  • id可以储存属于任何类的对象

        id dataValue; //存储属于任何类的对象。

        Fraction *f1 = [[Fraction alloc] init];
        Complex *c1 = [[Complex alloc] init];

        [f1 setTo:2 over:5];
        [c1 setReal:10.0 andImaginary:2.5];


        //第一个dataValue获得了一个分数

         dataValue = f1;    //将f1存储到dataValue中
        [dataValue print];  //dataValue可用于Fraction对象的任何方法

        //第一个dataValue获得了一个complex数

        dataValue = c1;     
        [dataValue print];  //调用方法的时候,首先检查dataValue中存储对象所属的类

Part 3. 静态类型

  • 静态:对存储在变量中对象的类型进行显式声明。

优点:
1. 更好在程序编译阶段而不是在程序运行时指出错误
2. 提高程序的可读性,使用有意义的变量名 id f1 比较 Fraction *f1

Part 4. 动态类型的参数和返回类型

  • 如果使用动态类型调用一个方法,需要注意一下规则:如果在多个类中实现名称相同的犯法,那么每个方法都必须符合各个参数的类型和返回值类型。

Part 5. 类,对象,方法从属关系的判定

        Square * mySquare = [[Square alloc] init];


        //isMemberOfClass:    对象和类的直接从属,不包括继承

        if ([mySquare isMemberOfClass:[Square class]] == YES) //YES

        if ([mySquare isMemberOfClass:[Rectangular class]] == YES) //NO


        //isKindOfClass   对象类的(直接,间接)从属,包括继承。

        if ([mySquare isKindOfClass:[Square class]] == YES)  //YES

        if ([mySquare isKindOfClass:[Rectangular class]] == YES)  //YES

        if ([mySquare isKindOfClass:[NSObject class]] == YES)  //YES


        //respondsToSelector: 类,对象和类方法,方法的响应

        if ([mySquare respondsToSelector:@selector(setSide:)] == YES) //YES

        if ([mySquare respondsToSelector:@selector(setWidth:andHeight:)] == YES) //YES

        if ([Square respondsToSelector:@selector(alloc)] == YES) //YES


        //instancesRespondToSelector 类实例是否能响应

        if ([Square instancesRespondToSelector:@selector(setSide:)] == YES) //YES

        if ([Rectangular instancesRespondToSelector:@selector(setSide:)] == YES)  //NO 方法setSide: 是Square的方法,Square是Rectanglular的子类


        //isSubClassOfClass 类和子类的从属

        if ([Square isSubclassOfClass:[Rectangular class]] == YES) //YES
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值