【Object-C】多态

Object-c 里面的指针类型有两种
1、编译时的类型,由申明该变量时使用的类型决定
2、运行时的类型,由运行时实际付给该变量的对象决定

如果编译时和运行时的类型不一致,就可能出现多态(Polymorphism)。
#import <Foundation/Foundation.h>
@interface DCBase : NSObject
-(
void) base ;
-(
void) test ;
@end

@interface DCSubclass : DCBase
-(void) test ;
-(void) sub ;
@end

#import "DCBase.h"
@implementation DCBase
-(void) base
{
   
 NSLog(@"父类的普通base方法");
}
-(void) test
{
   
 NSLog(@"父类将被覆盖的test方法");
}
@end


@implementation DCSubclass

- (
void) test
{
   
 NSLog(@"子类的覆盖父类的test方法");
}
- (void) sub
{
   
 NSLog(@"子类的sub方法");
}
@end

//
//  main.m
//  Polymorphism
//
//  Created by mac on 14-11-29.
//  Copyright (c) 2014 mac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import
 "DCBase.h"
#import
 "DCSubclass.h"

int main(int argc, const char * argv[]) {
   
 @autoreleasepool {
       
 // insert code here...
       
 NSLog(@"Hello, Polymorphism!");
      
       
 DCBase* bc = [[DCBase alloc] init];
       
 // 下面两次调用将执行BaseClass的方法
        [bc
 base];
        [bc
 test];
       
 // 下面编译时类型和运行时类型完全一样,因此不存在多态
       
 DCSubclass* sc = [[DCSubclass alloc] init];
       
 // 下面调用将执行从父类继承到的base方法
        [sc
 base];
       
 // 下面调用将执行子类重写的test方法
        [sc
 test];
       
 // 下面调用将执行子类定义的sub方法
        [sc
 sub];
       
        // 下面编译时类型和运行时类型不一样,多态发生.编译时类型为DCBase,运行时类型则
                //是DCSubclass,调用该对象的test方法时
        //实际调用了DCSubclass中的test方法。
       
 DCBase* ploymophicBc = [[DCSubclass alloc] init];
       
 // 下面调用将执行从父类继承到的base方法
        [ploymophicBc
 base];
       
 // 下面调用将执行子类重写的test方法
        [ploymophicBc
 test];
       
       
 // 因为ploymophicBc的编译类型是DCBase
       
 // DCBase类没有提供sub方法,所以下面代码编译时会出现错误。
        [ploymophicBc
 sub];
       
       
 // 可将任何类型的指针变量赋值给id类型的变量
       
 id dyna = ploymophicBc;
        [dyna
 sub];
       
 id mba = sc ;
        [mba
 sub];
       
       
    }
   
 return 0;
}



原文地址:https://www.cnblogs.com/shujucn/p/7481468.html