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指向的是同一个狗对象
以上总结还往大家多多指正、