標籤:objective-c 繼承
這第4篇內容比較少,主要說的是obj-c中的類的繼承,需要說明的是我只是寫了繼承中最簡單的形式,如果全部展開來說,那就多了去了!關鍵是現在肚子裡還沒裝夠墨水,沒法展開啊!
下面的代碼中,我們寫了2個類:父類A和子類B,然後B中對A中的方法做了重寫。
#import <Foundation/Foundation.h>@interface A:NSObject{int i;}@property int i;-(void)print;@end@implementation A@synthesize i;-(void)print{NSLog(@"[class A][i:%d]:hello!",i);}@end@interface B:A{int j;}@property int j;@end@implementation B@synthesize j;-(void)print{NSLog(@"[class B:A][i:%d,j:%d]hello!",i,j);}@endint main(int argc,char *argv[]){@autoreleasepool{NSLog(@"hello obj-c!");A *a = [[A alloc] init];B *b = [[B alloc] init];a.i = 101;b.i = 1001;b.j = 1002;[a print];[b print];}return 0;}
編譯運行結果如下:
[email protected]: objc_src$clang -fobjc-arc -framework Foundation 1.m -o 1
[email protected]: objc_src$./1
2014-06-29 10:34:30.547 1[1035:507] hello obj-c!
2014-06-29 10:34:30.549 1[1035:507] [class A][i:101]:hello!
2014-06-29 10:34:30.549 1[1035:507] [class B:A][i:1001,j:1002]hello!
好,下面我們稍微修改一下class A中執行個體變數i的定義,使它成為私人,即不在@interface中定義而在@implementation中定義i。這時編譯時間會發現class B中print會報錯:
[email protected]: objc_src$clang -fobjc-arc -framework Foundation 1.m -o 1
1.m:34:41: error: instance variable ‘i‘ is private
NSLog(@"[class B:A][i:%d,j:%d]hello!",i,j);
改正也很簡單呢,直接 self.i即可,下面是修改後的完整代碼:
#import <Foundation/Foundation.h>@interface A:NSObject@property int i;-(void)set_i:(int)i;-(void)print;@end@implementation A{int i;}@synthesize i;-(void)set_i:(int)i_v{i = i_v;}-(void)print{NSLog(@"[class A][i:%d]:hello!",i);}@end@interface B:A{int j;}@property int j;@end@implementation B@synthesize j;-(void)print{NSLog(@"[class B:A][i:%d,j:%d]hello!",self.i,j);}@endint main(int argc,char *argv[]){@autoreleasepool{NSLog(@"hello obj-c!");A *a = [[A alloc] init];B *b = [[B alloc] init];//a.i = 101;//b.i = 1001;[a set_i:99];[b set_i:199];b.j = 1002;[a print];[b print];}return 0;}