zoukankan      html  css  js  c++  java
  • 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;
    }
    




  • 相关阅读:
    数据库事务的四个隔离级别
    synchronized与Lock的区别
    线程池的注意事项
    守护线程与非守护线程
    wait与sleep的区别
    String,StringBuffer,StringBuilder
    2019牛客暑期多校训练营 第二场
    2019牛客暑期多校训练营 第一场
    Codeforces Round #568 (div. 2)
    Codeforces Round #570 (Div. 3)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4197064.html
Copyright © 2011-2022 走看看