前面的學習都一直在使用Object C物件,但是沒有具體總結過Object C中的物件使用特性,這裡簡單總結一下。
一. 繼承
在物件導向程式設計中,子類可以通過繼承得到父類的可以繼承的的屬性和方法,在Object C中也同樣如此。
先定義一個Person類,並且定義幾個屬性和一個方法:
#import <Foundation/Foundation.h> @interface Person : NSObject{ NSString *name; int age; NSArray *itmes; } @property (nonatomic,retain) NSString *name; @property (nonatomic,assign) int age; @property (nonatomic,retain) NSArray *itmes; -(void) write; @end
在上面的程式碼中,Person類定義了三個屬性name,age,items,對應的型別分別為NSString,int,NSArray. 其中還有一個方法write,返回值型別為void,沒有輸入引數。其具體描述內容如下:
#import "Person.h" @implementation Person @synthesize name; @synthesize age; @synthesize itmes; -(void) write{ NSLog(@"%d",self.age); NSLog(@"Person 物件呼叫write方法"); } @end
在write方法中我們可以看到輸出了age,並且輸出一個字串,這裡又來標識具體呼叫哪個方法。
再頂一個Student類,繼承Person類,在Person類中定義一個屬性address,為NSString型別,並且定義一個方法eat,返回值型別為void,沒有輸入引數,具體的程式碼如下:
#import <Foundation/Foundation.h> #import "Person.h" @interface Student : Person{ NSString *address; } @property (nonatomic,retain) NSString *address; -(void) eat; @end ------------------------------------------------------------------- #import "Student.h" @implementation Student @synthesize address; -(void) eat{ NSLog(@"Student 呼叫eat方法"); } @end
通過如上程式碼,Student就繼承了Person類的屬性和方法。
Person *person=[[Person alloc] init]; person.age=43; [person write]; Student *student=[[Student alloc] init]; student.address=@"上海"; student.age=99; [student eat]; [student write];
輸出如下結果:
2014-04-05 13:25:30.990 ObjectCApress[1659:303] 43 2014-04-05 13:25:30.992 ObjectCApress[1659:303] Person 物件呼叫write方法 2014-04-05 13:25:30.993 ObjectCApress[1659:303] Student 呼叫eat方法 2014-04-05 13:25:30.994 ObjectCApress[1659:303] 99 2014-04-05 13:25:30.995 ObjectCApress[1659:303] Person 物件呼叫write方法
通過以上程式碼我們可以看出,Student繼承了父類Person的屬性和方法。
二. 重寫
在呼叫物件繼承方法的時候,呼叫和執行的是基類的實現.但是,有時需要對派生類中的繼承方法有不同的實現.這個時候我們就需要重寫父類方法,但是在Object C中重寫和.NET中的重寫有點區別,不需要使用特殊的關鍵字標識。
在Object C重寫父類方法,只需要重新實現該方法即可,程式碼如下:
#import <Foundation/Foundation.h> #import "Person.h" @interface Student : Person{ NSString *address; } @property (nonatomic,retain) NSString *address; -(void) eat; @end ------------------------------------------------- #import "Student.h" @implementation Student @synthesize address; -(void) eat{ NSLog(@"Student 呼叫eat方法"); } -(void) write{ NSLog(@"呼叫Student的Write方法"); } @end
在上面的程式碼中看出Student.m類中有一個write方法,其就是重寫父類方法,不需要使用任何其他的修飾符。在上面的程式碼我們測試得到如果student類呼叫write 方法,其實是呼叫父類的方法,這裡Student再呼叫write方法看看:
Student *student=[[Student alloc] init]; student.address=@"上海"; student.age=99; [student eat]; [student write];
輸出結果如下:
2014-04-05 13:36:21.055 ObjectCApress[1698:303] Student 呼叫eat方法 2014-04-05 13:36:21.058 ObjectCApress[1698:303] 呼叫Student的Write方法
結果輸出"呼叫Student的write方法",說明這裡不是呼叫的父類方法了
三. 在子類呼叫父類方法
在.NET中我們可以使用super關鍵字來呼叫,在在Object C中也可以使用super 來呼叫父類的方法。
-(void) write{ NSLog(@"呼叫Student的Write方法"); [super write]; }
修改Student.m中的write方法,在這個方法中新增[super write] 語句用來呼叫父類的write方法。輸出結果如下:
2014-04-05 15:14:28.164 ObjectCApress[1815:303] Student 呼叫eat方法
2014-04-05 15:14:28.167 ObjectCApress[1815:303] 呼叫Student的Write方法
2014-04-05 15:14:28.168 ObjectCApress[1815:303] 99
2014-04-05 15:14:28.168 ObjectCApress[1815:303] Person 物件呼叫write方法
同樣使用以上程式碼來測試,得到如上輸出的結果,從結果中我們可以看得出,使用super呼叫了父類方法。
四. 過載
.NET中過載就是方法名相同而輸入引數不一樣,在Object C中並沒有過載。
-(void) eat; -(void) eat(int a);
我們嘗試使用.NET的那種方式過載方法,如上程式碼,使用編譯器編譯報錯,因為Object C中不支援方法的過載。