- /******************************************
- * 今天对 “多态” 进行学习.收获如下:
- * 1.如果编译时和运行时类型不一致,就可能出现所谓的多态
- *
- * 2.1⃣️编译时:由声明的类型决定;2⃣️运行时:由实际赋值类型决定
- *
- * 3.如果想在多态状态下,调用对象的运行时类型的方法,可以将其:1⃣️复制给id类型,2⃣️将其强制转换为运行时类型。
- * 这种强制类型转换只是改变了该指针变量的编译时类型,但该变量所指向对象的实际类型并不会发生任何改变。
- *
- * 4.判断指针变量的实际类型(一般在执行强制转换之前先进行判断):
- * 1⃣️-(BOOL) isKindOfClass : clazz 判断是否为clazz或其子类实例
- * 2⃣️- (BOOL)isSubclassOfClass : clazz 判断是否为clazz的子类实例
-
- Date: 2015/5/12
- *******************************************/
- #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;
复制代码
|
|