1.多態(tài)的基本概念
某一類事物的多種形態(tài)
OC對象具有多態(tài)性
2.多態(tài)的體現(xiàn)
Person *p = [Student new];
p->age = 100;
[p walk];
子類對象賦值給父類指針
父類指針訪問對應(yīng)的屬性和方法
3.多態(tài)的好處
用父類接收參數(shù),節(jié)省代碼
4.多態(tài)的局限性
不能訪問子類的屬性(可以考慮強(qiáng)制轉(zhuǎn)換)
5.多態(tài)的細(xì)節(jié)
動態(tài)綁定:在運(yùn)行時根據(jù)對象的類型確定動態(tài)調(diào)用的方法
6.代碼
1 #import <Foundation/Foundation.h> 2 3 /* 4 多態(tài) 5 1.沒有繼承就沒有多態(tài) 6 2.代碼的體現(xiàn):父類類型的指針指向子類對象 7 3.好處:如果函數(shù)/方法參數(shù)中使用的是父類類型,可以傳入父類、子類對象 8 4.局限性: 9 1> 父類類型的變量 不能 直接調(diào)用子類特有的方法。必須強(qiáng)轉(zhuǎn)為子類類型變量后,才能直接調(diào)用子類特有的方法 10 */ 11 12 // 動物 13 @interface Animal : NSObject 14 - (void)eat; 15 @end 16 17 @implementation Animal 18 - (void)eat 19 { 20 NSLog(@"Animal-吃東西----"); 21 } 22 @end 23 24 // 狗 25 @interface Dog : Animal 26 - (void)run; 27 @end 28 29 @implementation Dog 30 - (void)run 31 { 32 NSLog(@"Dog---跑起來"); 33 } 34 - (void)eat 35 { 36 NSLog(@"Dog-吃東西----"); 37 } 38 @end 39 40 // 貓 41 @interface Cat : Animal 42 43 @end 44 45 @implementation Cat 46 - (void)eat 47 { 48 NSLog(@"Cat-吃東西----"); 49 } 50 @end 51 52 // 這個函數(shù)是專門用來喂動畫 53 //void feed(Dog *d) 54 //{ 55 // [d eat]; 56 //} 57 // 58 //void feed2(Cat *c) 59 //{ 60 // [c eat]; 61 //} 62 // 63 64 // 如果參數(shù)中使用的是父類類型,可以傳入父類、子類對象 65 void feed(Animal *a) 66 { 67 [a eat]; 68 } 69 70 int main() 71 { 72 // NSString *d = [Cat new]; 73 // [d eat]; 74 75 /* 76 Animal *aa = [Dog new]; 77 // 多態(tài)的局限性:父類類型的變量 不能 用來調(diào)用子類的方法 78 //[aa run]; 79 80 // 將aa轉(zhuǎn)為Dog *類型的變量 81 Dog *dd = (Dog *)aa; 82 83 [dd run]; 84 */ 85 86 //Dog *d = [Dog new]; 87 88 //[d run]; 89 90 /* 91 Animal *aa = [Animal new]; 92 feed(aa); 93 94 Dog *dd = [Dog new]; 95 feed(dd); 96 97 Cat *cc = [Cat new]; 98 feed(cc); 99 */100 101 /*102 // NSString *s = [Cat new];103 Animal *c = [Cat new];104 105 106 NSObject *n = [Dog new];107 NSObject *n2 = [Animal new];108 109 110 // 多種形態(tài)111 //Dog *d = [Dog new]; // Dog類型112 113 // 多態(tài):父類指針指向子類對象114 Animal *a = [Dog new];115 116 // 調(diào)用方法時會檢測對象的真實(shí)形象117 [a eat];118 */119 return 0;120 }
新聞熱點(diǎn)
疑難解答