obj-c編程04:類的繼承
這第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);
}
@end
int 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;
}
編譯運行結果如下:
apple@kissAir: objc_src$clang -fobjc-arc -framework Foundation 1.m -o 1
apple@kissAir: 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會報錯:
apple@kissAir: 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);
}
@end
int 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;
}
[2014-06-30 第一次增加內容:實例變量的可見性]:
我們上麵談到了定義類實例變量的語法,其實對於實例變量的可見範圍還可以進一步細化控製,主要有4種可見性,默認是第1種:
1 @protected:實例變量可以被該類和子類直接訪問(默認);
2 @private:實例變量隻能被該類方法訪問;
3 @public:實例變量可以被該類,子類以及外部方法訪問(需要用->語法,見下麵代碼);
4 @package:在64位映像中,實例變量可在映像的任何位置被訪問。(不太明白哦)
下麵上代碼吧:
#import <Foundation/Foundation.h>
@interface A:NSObject{
@private
int pri_i;
@protected
int i;
@public
int pub_i;
}
@property int i,pri_i;
-(void)set_i:(int)i;
-(void)print;
@end
@implementation A
@synthesize i=i,pri_i=pri_i;
-(void)set_i:(int)i_v{
i = i_v;
}
-(void)print{
NSLog(@"[class A][i:%d,pri_i:%d,pub_i:%d]:hello!",i,pri_i,pub_i);
}
@end
@interface B:A{
int j;
}
@property int j;
@end
@implementation B
@synthesize j;
-(void)print{
//NSLog(@"[class B:A]pri_i : %d",pri_i); ERR!pri_i is privated!
NSLog(@"[class B:A][i:%d,j:%d]hello!",i,j);
}
@end
int main(int argc,char *argv[])
{
@autoreleasepool{
NSLog(@"hello obj-c!");
A *a = [[A alloc] init];
B *b = [[B alloc] init];
a->pub_i = 10;
b->pub_i = 20;
//a.i = 101;
//b.i = 1001;
[a set_i:99];
[b set_i:199];
b.j = 1002;
[a print];
[b print];
}
return 0;
}
最後更新:2017-04-03 06:03:06