標籤:
學習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 繼承和多態