首页 > 代码库 > obj-c编程04:类的继承
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);
改正也非常easy呢,直接 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; }
obj-c编程04:类的继承