您的位置:首页 > 职场人生

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

2015-05-26 14:46 176 查看
------<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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: