029.Polymorphism 多态

---------------  FKBase.h  ---------------
#import <Foundation/Foundation.h>
@interface FKBase : NSObject
- (
void ) base;
- (
void ) test;
@end
---------------  FKBase.m  ---------------
#import "FKBase.h"
@implementation FKBase
- (
void ) base
{
     NSLog(@"父类的普通base方法");
}
- (
void ) test
{
     NSLog(@"父类的将被覆盖的test方法");
}
@end
---------------  FKSubclass.h  ---------------
#import <Foundation/Foundation.h>
#import "FKBase.h"
@interface FKSubclass : FKBase
- (
void ) sub;
@end
---------------  FKSubclass.m  ---------------
#import "FKSubclass.h"
@implementation FKSubclass
- (
void ) test
{
     NSLog(@"子类的覆盖父类的test方法");
}
- (
void ) sub
{
     NSLog(@"子类的sub方法");
}
@end
---------------  main.m  ---------------
#import <Foundation/Foundation.h>
#import
"FKSubclass.h"
int main()
{
   
// 下面编译时类型和运行时类型完全一样,因此不存在多态
    FKBase* bc = [[FKBase alloc] init];
   
// 下面两次调用将执行 FKBase 的方法
    [bc base];
    [bc test];
   
// 下面编译时类型和运行时类型完全一样,因此不存在多态
    FKSubclass* sc = [[FKSubclass alloc] init];
   
// 下面调用将执行从父类继承到的 base 方法
    [sc base];
   
// 下面调用将执行子类重写的 test 方法
    [sc test];
   
// 下面调用将执行子类定义的 sub 方法
    [sc sub];
   
// 下面编译时类型和运行时类型不一样,多态发生
    FKBase* ploymophicBc = [[FKSubclass alloc] init];
   
// 下面调用将执行从父类继承到的 base 方法
    [ploymophicBc base];
   
// 下面调用将执行子类重写的 test 方法
    [ploymophicBc test];
   
// 因为 ploymophicBc 的编译类型是 FKBase
   
// FKBase 类没有提供 sub 方法 , 所以下面代码编译时会出现错误。
    // [ploymophicBc sub];
    // 可将任何类型的指针变量赋值给 id 类型的变量
   
id dyna = ploymophicBc;
    [dyna sub];
}

一、编写本节代码的具体步骤:
1.可仿照第二章001节的代码编写步骤,不同的是,本节代码要创建两个类。

二、本节代码涉及到的知识点:
1.OC指针类型的变量有两个,一个是编译时的类型,一个是运行时的类型。
2.编译时的类型,由声明该变量时使用的类型决定。
3.运行时的类型,由实际赋给该变量的对象决定。
4.如果编译时类型和运行时类型不一致,就可能出现多态。
5.上面的代码中,ploymophicBc是一个指针变量,它在编译时的类型是FKBase,
  而运行时的类型是FKSubclass。当调用该指针的test方法时,实际执行的将是子类中重写的方法。
6.id类型的变量可以调用该变量实际所指对象的方法。所以上面代码中的最后一句可以执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值