OC面向对象之-多态

OC面向对象-多态


学了好多编程语言,当被问到面向对象的多态时,我懵逼了。。。。(据说会写设计模式的都懂多态,我的路还很长啊、)

下面是我整理的一些概念。

  • 用一个基类的指针指向子类的对象,在函数调用时可以调用到正确版本的函数
  • 一个基类的指针当函数的参数,用这个指针可以接受到任何他的子类对象也包括他自己
  • 一个基类的指针指向子类的对象
  • 在复合类中,尽量引用高层次的类(基类的指针)当做类的成员变量,这样就可以创建出它所对应的任何类对象包括它自己

案例一:

/*
**父类指针指向子类创建的对象**
*/
#import "Dog.h"
#import "Cat.h"
int main(int argc, const char * argv[])
{
    Animal *a = [[Animal alloc] init];

    Animal *cat = [[Cat alloc] init];

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

    [a print];
    [cat print];
    [dog print];

    return 0;
}
结果:
 ****类练习****[2134:302819] 我是动物
 ****类练习****[2134:302819] Cat
 ****类练习****[2134:302819] Dog

案例二:

/*
 增加代码扩展性
 */
void printSelf(Animal *a)
{
    //用一个基类的形参,接受来自子类的对象。
    [a print];
}
int main(int argc, const char * argv[])
{
    Animal *a = [[Animal alloc] init];

    Animal *cat = [[Cat alloc] init];

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

    printSelf(a);
    printSelf(cat);
    printSelf(dog);

    return 0;
}
结果:
 ****类练习****[2134:302819] 我是动物
 ****类练习****[2134:302819] Cat
 ****类练习****[2134:302819] Dog

案例三:

在复合类中,尽量引用高层次的类(基类的指针)当做类的成员变量,这样就可以创建出它所对应的任何类对象包括它自己

  • .h文件中
/** 猫 */
@property (nonatomic , strong)Animal *cat;

/** 狗 */
@property (nonatomic , strong)Animal *dog;
  • .m文件中
-(instancetype)init
{
    if (self = [super init])
    {
        _cat = [[Cat alloc] init];
    }
    return self;
    /*
    if (self = [super init])
    {
        _dog = [[Dog alloc] init];
    }
    return self;
    */
}
多态的局限性
  • 父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。
Animal *a=[[Dog alloc] init];
//在Animal类中没有print方法,这里调用了狗对象的方法。
[a print];
//解决方法:可以将a强制转换为Dog*类型的变量,如下:
Dog *d=(Dog *)a;//使用强制转换,这里a和d指向的是同一个狗对象

以上总结还往大家多多指正、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值