———–Java培训、Android培训、IOS培训、.Net培训、期待与您交流!————
本节是个人学习过程中的笔记,供初学者一起学习,欢迎大家批评指正,留言参与讨论,谢谢。
本节内容,用僵尸作为例子实现多态性学习,代码如下:
//利用植物大战僵尸里面的僵尸类来学习多态
#import <Foundation/Foundation.h>
@interface Zombie : NSObject
{
int _speed;
char* _name;
}
- (Zombie*)init;
- (int)speed;
- (char*)name; //复制的时候,千万注意需要改变的地方,比如返回值类型
- (void)walk;
@end
@implementation Zombie
- (Zombie*)init
{
_speed = 30;
_name = "Zombie";
return self;
}
- (int)speed{ return _speed;}
- (char*)name{ return _name;}
- (void)walk
{
NSLog(@"一个%s用%dkm/h的速度在走!",_name,_speed);
}
@end
@interface JumpZombie : Zombie
{
}
- (JumpZombie*)init;
//- (void)walk;
@end
@implementation JumpZombie
- (JumpZombie*)init
{
_speed = 50;
_name = "JumpZombie";
return self;
}
@end
@interface RunZombie : Zombie
{
}
- (RunZombie*)init;
@end
@implementation RunZombie
- (RunZombie*)init
{
_speed = 80;
_name = "RunZombie";
return self;
}
@end
//void compareZombieSpeedWith: (Zombie*)z1 And: (Zombie*)z2
//{
// [z1 walk];
// [z2 walk];
// NSLog(@"z1与z2速度分别为%d,%d,差距为%d",[z1 speed],[z2 speed],[z1 speed]-[z2 speed]);
//}
//方法与函数,傻傻地分不清楚,差别体现在参数与括号的运用
void compareZombieSpeed(Zombie* z1,Zombie* z2)//本函数,比较两个僵尸速度,体现多态性
{
[z1 walk];
[z2 walk];
NSLog(@"%s与%s速度分别为%d,%d,差距为%d",[z1 name],[z2 name],[z1 speed],[z2 speed],[z1 speed]-[z2 speed]);
}
void test()
{
//测试,子类调用父类继承下来的方法调用成员变量,看看访问的成员变量是父类的还是子类的。
JumpZombie* jz = [[JumpZombie new] init];
[jz walk];
RunZombie* rz = [[RunZombie new] init];
[rz walk];
//结果证明,如果子类不去重写父类方法,那么即使子类中没有看到父类的继承内容,但是系统会自动复制父类财产到子类中去。所以,上面调用的方法,仍然是子类从父类那里复制下来的方法。
//测试多态
NSLog(@"用Zombie指针指向一个JumpZombie对象,并调用其方法。");
Zombie* z = [[JumpZombie new] init];
[z walk];//如果walk方法不是继承下来的,而是子类拓展的,这里就会编译产生警告,但是还能运行出正确结果,这也是弱类型的一种体现。终究是个隐患,可以用下面的强制类型转换来处理。
//测试 强制类型转换,和 OC弱语法的体现
NSLog(@"用Zombie指针指向一个JumpZombie对象,强制转为JumpZombie指针后再调用其方法。");
JumpZombie* temp = (JumpZombie*)z;//此处是圆括号,不是方括号
[temp walk];
// compareZombieSpeedWith: jz And: rz; 好吧,方法只能写在内的实现中,其他地方都是函数的天下
compareZombieSpeed(jz,rz);
//匿名对象
compareZombieSpeed([[Zombie new] init],[[RunZombie new] init]);
}
int main()
{
test();
return 0;
}
运行结果如下: