黑马程序员—OC学习笔记—多态性学习

———–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;
}

运行结果如下:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值