iOS开发之oc(四)--多态、动态绑定

 多态:也就是多种形态,每一个OC对象都有多态性 。

 1.没有继承就没有多态

 2.代码的体现:父类类型的指针指向子类对象

 3.好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象

 4.局限性:

 1> 父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法

动态绑定:当我们使用多态定义的某个指针a去调用某个方法时,它会做一个动态绑定过程,它会动态检测a指向的这个对象的真实类型是什么类型,因此,调用这个对象方法时,它会调用真实类型的方法。

代码示例

#import <Foundation/Foundation.h>

// 动物
@interface Animal : NSObject
- (void)eat;
@end

@implementation Animal
- (void)eat
{
    NSLog(@"Animal-吃东西----");
}
@end

//
@interface Dog : Animal
- (void)run;
@end

@implementation  Dog
- (void)run
{
    NSLog(@"Dog---跑起来");
}
- (void)eat
{
    NSLog(@"Dog-吃东西----");
}
@end

//
@interface Cat : Animal
@end

@implementation Cat
- (void)eat
{
    NSLog(@"Cat-吃东西----");
}
@end

// 这个函数是专门用来喂狗
//void feed(Dog *d)
//{
//    [d eat];
//}
//
//void feed2(Cat *c)
//{
//    [c eat];
//}
//

// 如果参数中使用的是父类类型,可以传入父类、子类对象
void feed(Animal *a)
{
    [a eat];
}

int main()
{
    // NSString *d = [Cat new];
    // [d eat];
    
 /*
    Animal *aa = [Dog new];
    // 多态的局限性:父类类型的变量 不能 用来调用子类的方法
    //[aa run];
    
    // 将aa强转为Dog *类型的变量
    Dog *dd = (Dog *)aa;
    
    [dd run];
 */
    
    //Dog *d = [Dog new];
    
    //[d run];
    
 /*
    Animal *aa = [Animal new];
    feed(aa);
    
    Dog *dd = [Dog new];
    feed(dd);
    
    Cat *cc = [Cat new];
    feed(cc);
 */
    
   
/* // NSString *s = [Cat new]; Animal *c = [Cat new]; NSObject *n = [Dog new]; NSObject *n2 = [Animal new]; // 多种形态 //Dog *d = [Dog new]; // Dog类型 // 多态:父类指针指向子类对象 Animal *a = [Dog new]; // 调用方法时会检测对象的真实类型 [a eat]; */ return 0; }

 

posted @ 2015-02-24 13:16  timo1234  阅读(260)  评论(0编辑  收藏  举报