小白学开发(iOS)OC_多态(2015-07-27)

本文介绍了Objective-C中多态的概念及其应用实例。通过具体的代码示例解释了多态的基本原理,包括对象的多种表现形式、多态在代码中的体现方式、多态的前提条件、动态绑定机制以及多态带来的好处和局限性。
 //
//  main.m
//  多态
//
//  Created by admin on 15/7/27.
//  Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Animal.h"
#import "Dog.h"
//#import "Cat.h"

int main(int argc, const char * argv[]) {
/*
    1. 多态就是某一类事物的多重形态
        例如:猫,既是猫 同时 又是动物,这里猫有两种形态
             男人,既是男人 又是人 同时 又是高级动物,这里男人有三种形态

    2. 多态在代码中的体现:
            > 用父类的指针 指向了子类对象,这就是对象
        例如:动物 *a =[猫 new];      //  这里动物类是猫类的父类
             人 *r =[男人 new];      //  这里人类是男人类的父类
 
    3. 使用多态的前提
            > 必须要有继承,没有继承就没有多态
 
    4. 动态绑定
            > 即运行方法时会动态检查对象的真实类型
        例如:
            Animal *a = [Cat new];
            [a eat];   //  这里当通过a指针调用eat方法时候,系统会自动检测出对象的真实类型为Cat而不是Animal
    5. 多态的好处
            > 多态的存在提高了程序的可扩展性
    
    6. 多态的局限性
            > 父类类型的指针不能调用子类对象的特有方法,如果要调用,必须强制类型转换为子类类型
 
        注意:但是不要把父类类型强制转换为子类类型,因为有动态绑定,系统会自动检测真类型
 */
    Person *p = [Person new];
    Dog *d = [Dog new];
  //  Cat *c = [Cat new];
  //  Animal *a = [Animal new];
    
    [p feedDog:d];

    [p feedAnimal:d];      //  这里传入实参为狗对象,打印结果为:狗要吃东西,
    
    
    return 0;
}
//
//  Person.h
//  多态
//
//  Created by admin on 15/7/27.
//  Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Dog.h"
//#import "Cat.h"

@interface Person : NSObject

//  喂狗
- (void)feedDog:(Dog *)dog;
//  喂猫
//- (void)feedCat:(Cat *)cat;

//  但是这里如果有一千种动物,那么就要写一千个喂养的方法,可是这些方法除了参数不同
//  其他大致相同,那么我们可以把参数设置成狗和猫的父类Animal类,使用父类对象传入
//  根据多态的 动态绑定特性,在调用方法运行时候,会使用实际对象,也就是每中动物对象调用方法

- (void)feedAnimal:(Animal *)animal;

@end
//
//  Person.m
//  多态
//
//  Created by admin on 15/7/27.
//  Copyright (c) 2015年 admin. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)feedDog:(Dog *)dog
{
    [dog eat];
}
//  喂猫
//- (void)feedCat:(Cat *)cat
//{
//    [cat eat];
//}

- (void)feedAnimal:(Animal *)animal
{
//    运行时候动态绑定(动态的判断animal的真实类型)
    [animal eat];
}

@end
//
//  Animal.h
//  多态
//
//  Created by admin on 15/7/27.
//  Copyright (c) 2015年 admin. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Animal : NSObject
{
    int _age;
}

- (void)eat;

@end
//
//  Animal.m
//  多态
//
//  Created by admin on 15/7/27.
//  Copyright (c) 2015年 admin. All rights reserved.
//

#import "Animal.h"

@implementation Animal

- (void)eat
{
    NSLog(@"动物都会吃东西!");
}
@end
//
//  Dog.h
//  多态
//
//  Created by admin on 15/7/27.
//  Copyright (c) 2015年 admin. All rights reserved.
//
#import "Animal.h"

@interface Dog : Animal


- (void)eat;

- (void)jiao;

@end
//
//  Dog.m
// 多态
//
//  Created by admin on 15/7/27.
//  Copyright (c) 2015年 admin. All rights reserved.
//

#import "Dog.h"

@implementation Dog

- (void)eat
{
    NSLog(@"狗要吃东西");
}

- (void)jiao
{
    NSLog(@"一只会叫的狗!");
}

@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值