------<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;
}