Objective-C學習篇04—多態,objective-c04多態
多態
多態的概念
有這樣一個例子.早上我和同事說口渴了.結果:A同事拿著我的水杯去給我接了一杯水.B同事順手在飲水機上拿了一次性紙杯給我接了杯水。C同事給了我一瓶他早上剛買的飲料。同事們得到的是同樣的請求,但是三個人都有各自的解決辦法,這就是多態。
在物件導向的程式設計理論中,多態(polymer phism)指的是,同一操作作用於不同類的執行個體時,將產生不同的執行效果.即不同類的對象收到相同的訊息時,也能得到不同的結果.
我們知道,OC是一門動態語言,在使用多態時,系統會進行動態檢測,以調用真實的對象方法. 在具有繼承關係的前提下,多態在代碼中體現為父類指標指向子類對象.
實現:
首先建立一個Animal類,讓其繼承自NSObject
Animal.h
@interface Animal : NSObject
// 聲明動物吃東西的方法- (void)eat;@end
Animal.m
@implementation Animal
- (void)eat {
NSLog(@"動物吃東西");
} @end
再建立一個一個Cat類和Dog類,分別重寫自己專屬的方法.
Cat 類
Cat.h
// Cat繼承自Animal類
@interface Cat : Animal
@end
Cat.m
@implementation Cat
// 重寫貓專屬的方法
- (void)eat {
NSLog(@"貓吃魚");
} @end
Dog類
Dog.h
// Dog繼承自Animal類,擁有了Animal所有的屬性和方法
@interface Dog : Animal
@end
Dog.m
@implementation Dog
// 重寫狗專屬的方法
- (void)eat {
NSLog(@"狗吃骨頭");
} @end
回到main中實現:
// 建立animal對象 Animal *animal = [[Animal alloc] init]; // 多態的實現: //1. 父類指標指向子類對象 animal = [[Cat alloc] init]; // 此時調用的方法到底是 動物吃東西呢? 還是貓吃東西呢? [animal eat];
//2. animal = [[Dog alloc] init]; [animal eat];
列印:
2015-11-27 17:31:38.975 DuoTai[1597:251835] 貓吃魚
2015-11-27 17:31:38.975 DuoTai[1597:251835] 狗吃骨頭
下面,我們再來看這樣兩行代碼:
Dog *dog = [[Animal alloc] init]; // 動物是一條狗?這樣的邏輯正確嗎??
NSString *string = [[Dog alloc] init]; // 狗是一個字串??
由上面發現:
OC語言是一門弱文法的語言,編譯的時候並不會報錯,系統只會發出警告.所以這就要求我們在實際的開發過程中一定要按照既定的規範來寫代碼。
多態的局限
父類指標不能直接調用子類專屬的方法,雖然可以調用成功,但是這樣寫是不規範的
Animal *animal2 = [[Cat alloc] init];
[animal2 eat];
// [animal2 catchMouth];
多態的好處:
女孩一般比較喜歡養寵物,現在建立一個女孩類,讓她擁有養寵物的方法
Girl.h
@class Animal; // 在Girl.h中用@class引入 Animal的標頭檔,告訴編譯器後面的是一個類@interface Girl : NSObject
- (void)feedAnimal:(Animal *)animal;@end
Girl.m
#import "Animal.h" // 在Girl.m中用#import引入Animal的標頭檔@implementation Girl
- (void)feedAnimal:(Animal *)animal { NSLog(@"女孩飼養寵物%@", animal);}
@end
main.m
// 建立一個女孩對象 Girl *girl = [[Girl alloc] init]; // 前男友送了它一隻貓cat,她需要飼養 Cat *cat = [[Cat alloc] init]; // 女孩對象調用飼養動物的方法,將貓傳進去 [girl feedAnimal:cat]; // 現在,前男友把甩了,認識了新男友,新男友送了一隻狗夠給她,她也需要飼養 Dog *d = [[Dog alloc] init]; // 女孩對象調用飼養動物的方法,將狗傳進去 [girl feedAnimal:d];
// 列印結果
2015-11-27 22:02:22.887 DuoTai[1812:401072] 女孩飼養寵物<Cat: 0x100206410>
2015-11-27 22:02:22.887 DuoTai[1812:401072] 女孩飼養寵物<Dog: 0x1003006c0>
多態的優點
貓和狗都是繼承自Animal這個類,在這裡我們就可以使用多態來簡化代碼了,只需要把函數的參數寫成Animal * 類型的,那麼Dog 和Cat類型的對象就可以傳進來了,在調用的時候直接改變參數就可以了.
多態是物件導向編程的一個重要特徵,它大大地增強了軟體的靈活性和擴充性.