[置顶] 黑马程序员—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;
}





你可能感兴趣的:([置顶] 黑马程序员—OC基础--初探“多态”)