Objective-C 繼承和多態

來源:互聯網
上載者:User

標籤:

  學習Java我們知道類有三大特徵,封裝,繼承,多態.而在Objective-C中也有繼承的概念,今天就來看看Objective-C中的繼承和多態.

  首先,我們來看看範例程式碼:

//Animal.h#import <Foundation/Foundation.h> @interface Animal : NSObject{int food_consumption; //食量int count; //數量int parturition_days; //生產周期}-(int)count;-(void)setCount:(int)c;-(int)foodConsumption;-(void)setFoodConsumption:(int)food_c;-(int)parturitionDays;-(void)setParturitionDays:(int)parturition_day;@end

 

//Animal.m#import "Animal.h"@implementation Animal-(int)count{return count;}-(void)setCount:(int)c{count = c;}-(int)foodConsumption{return food_consumption;}-(void)setFoodConsumption:(int)food_c{food_consumption = food_c;}-(int)parturitionDays{return parturition_days;}-(void)setParturitionDays:(int)parturition_day{parturition_days = parturition_day;} @end

 

//Panda.h#import "Animal.h" @interface Panda : Animal@end

 

//Panda.m#import "Panda.h"@implementation Panda@end

 

//Tool.h#import <Foundation/Foundation.h>#import "Animal.h"#import "Panda.h"@interface Tool : NSObject+(void) initWithAnimalDictionary:(Animal *)animal andDict:(NSDictionary *)dict;@end

 

//Tool.m#import "Tool.h"@implementation Tool+(void) initWithAnimalDictionary:(Animal *)animal andDict:(NSDictionary *)dict{    NSDictionary *animalDict;    if(YES == [animal isKindOfClass:[Panda class]]){        animalDict = [dict objectForKey:@"Panda"];            }else{        NSLog(@"error class!");    }    [animal setCount:[[animalDict objectForKey:@"count"] intValue]];    [animal setFoodConsumption:[[animalDict objectForKey:@"food_consumption"] intValue]];    [animal setParturitionDays:[[animalDict objectForKey:@"parturition_days"] intValue]];}@end

 

 data.plist檔案

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>fodder</key><dict><key>count_num</key><string>1024</string></dict><key>Panda</key><dict><key>food_consumption</key><string>2</string><key>count</key><string>6</string><key>parturition_days</key><string>76</string></dict></dict></plist>

 

//main.m#import <Foundation/Foundation.h>#import "Tool.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        // insert code here...        Panda *panda = [[Panda alloc] init];            //讀取plist        NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];        NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];            [Tool initWithAnimalDictionary:panda andDict:data];            int fooder_num = 0;        int surplus = 0;        int day = 1;            NSDictionary *fooderDict = [data objectForKey:@"fodder"];        fooder_num = [[fooderDict objectForKey:@"count_num"] intValue];        surplus = fooder_num;            while(surplus > 0){            if(0 == (day % [panda parturitionDays])){                [panda setCount:([panda count] + 1)];            }            surplus = fooder_num - ([panda count] * [panda foodConsumption]);            fooder_num = surplus;                    if(surplus){                NSLog(@"第 %d 天,熊貓:%d 只,飼料餘量:%d 。\n", day, [panda count],  surplus);            }            day++;        }    }    return 0;}

 

 

 (一)繼承  

  繼承是類中的一個重要的特性,它的出現使得我們沒必要別寫重複的代碼,可重用性很高。當然Objective-C中的繼承和Java中是一樣的,沒多大區別.不僅僅Java,C++也有繼承特性,但C++支援多繼承,而Objective-C不支援多繼承.

  接下來,我們瞭解幾個概念:

  (1)超類(superclass),是你所繼承的類,例如,Panda的超類是Animal,Animal的超類是NSObject.

  (2)父類(parentclass),是超類的另一種表達方式,例如,Animal是Panda的父類.

  (3)子類(subclass),是實施繼承的類,例如,Panda是Animal的子類.

  (4)孩子類(childclass),是子類的另一種表達方式,例如,Panda是Animal的孩子類.

  然後,說說繼承的工作機制:

  (1)方法調度

  當代碼發送訊息時,Objective-C的方法發送器將在當前類中搜尋相應的方法.如果發送器無法在接收訊息的對象類中找到相應的方法,它就在該對象的超類中進行尋找.

  (2)執行個體變數

  接下來我們看看Objective-C如何訪問執行個體變數.建立一個新類時,其對象首先從自身的超類中繼承執行個體變數,然後(可選)添加它們自己的執行個體變數.

  最後,說說重寫方法,製作自己全新的子類時,通常需要添加自己的方法.有時,為了在類中引入某個獨特的特性,需要添加新方法.還有些時候,可能需要替換或增強由這個新類的某個超類所定義的現有方法.當遇到我們子類特有的方法時,則只需要在子類中重寫該方法即可.

(二)多態

  在Objective-C中,多態就是指,父類指標可以指向子類.

+(void) initWithAnimalDictionary:(Animal *)animal andDict:(NSDictionary *)dict;

   上例代碼中的從字典中擷取資料的類方法就很好地使用了多態.該方法主要是從字典中讀取資料,樣本中只有Panda一個子類,若是以後擁有更多的類,那麼該功能的方法需要為每一個子類寫一個方法,而使用多態特性,則只需根據傳入的參數進行分別處理即可,減少代碼冗餘問題.

  以上,是學習Objective-C時對繼承和多態的理解.

Objective-C 繼承和多態

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.