Objective-C學習篇04—多態,objective-c04多態

來源:互聯網
上載者:User

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類型的對象就可以傳進來了,在調用的時候直接改變參數就可以了.

  多態是物件導向編程的一個重要特徵,它大大地增強了軟體的靈活性和擴充性.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.