黑马程序员—OC基础--初探“多态”

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ———


/******************************************

 *      今天对多态 进行学习.收获如下:

 *  1.如果编译时和运行时类型不一致,就可能出现所谓的多态

 *

 *  2.1⃣️编译时:由声明的类型决定;2⃣️运行时:由实际赋值类型决定

 *

 *  3.如果想在多态状态下,调用对象的运行时类型的方法,可以将其:1⃣️复制给id类型,2⃣️将其强制转换为运行时类型。

 *      这种强制类型转换只是改变了该指针变量的编译时类型,但该变量所指向对象的实际类型并不会发生任何改变。

 *

 *  4.判断指针变量的实际类型(一般建议在执行强制转换之前先机型判断):

 *      1⃣️-(BOOL) isKindOfClass : clazz        判断是否为clazz或其子类实例

 *      2⃣️- (BOOL)isSubclassOfClass : clazz    判断是否为clazz的子类实例

 


 *******************************************/



代码实现:



#import <Foundation/Foundation.h>
/**************************************************************/
@interface LBXYBase : NSObject

- (void) base;
- (void) test;

@end
/****************/
@implementation LBXYBase

- (void) base
{
    NSLog(@"父类的普通base方法");
}

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

@end
/**************************************************************/

/**************************************************************/
@interface LBXYSubclass : LBXYBase

- (void) sub;

@end
/****************/
@implementation LBXYSubclass

- (void) sub
{
    NSLog(@"子类的sub方法");
}

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

@end
/**************************************************************/


int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
    //下面只是正常使用,不发生多态
        LBXYBase* bc = [[LBXYBase alloc] init];
        [bc base];
        [bc test];
        LBXYSubclass* sc = [[LBXYSubclass alloc] init];
        [sc base];
        [sc test];  //和上面的test方法并不相同,这里是覆写的test方法
        [sc sub];
        NSLog(@"************************************");
        
    //下面编译时和运行时类型不一样,发生多态
        LBXYBase* ploymophicBc = [[LBXYSubclass alloc] init]; //出现多态,将LBXYSubclass类型的对象赋值给LBXYBase类型的指针变量,即子类变量赋值给父类指针
        [ploymophicBc base];    //ploymophicBc对象,在编译时为LBXYBase类型,运行时为LBXYSubclass类型
        [ploymophicBc test];
        
        NSLog(@"****************************使用id类型传递");
        
    //  [ploymophicBc sub];   //ploymophicBc运行时为LBXYSubclass类型的对象,但在在编译时为LBXYBase类型的对象,所以调用LBXYSubclass类的sub方法会报错
        id dyna1 = ploymophicBc; //解决办法1⃣️:将多态对象赋值给id类型,就能够调用“该对象在运行时类型的任意方法”
        [dyna1 sub];
        
        NSLog(@"****************************使用强制转换");
        
        if([ploymophicBc isKindOfClass:[LBXYSubclass class]])   //判断ploymophicBc对象是否LBXYSubclass或其子类的实例
        {
            LBXYSubclass* dyna2 = (LBXYSubclass*) ploymophicBc;//解决办法2⃣️:强制转换
            [dyna2 sub];
        }
        
    }
    return 0;
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值