OC面向对象之-多态

来源:互联网 发布:域名目录反向解析ip 编辑:程序博客网 时间:2024/06/12 04:00

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指向的是同一个狗对象

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

1 0