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;
}




相关文章
|
25天前
|
数据库 Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(下)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)
49 0
|
25天前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
60 0
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(中)
## 封装,继承和多态 ## 1.封装 1、满足把内容封装到某个地方,另一个地方去调用封装的内容 2、使用初始化构造方法,或者使用self获取封装的内容 ## 2.继承 子类继承父类的属性和内容
117 0
C#(二十一)之派生类中的构造函数 object类
今天看下派生类中的有参数和无参数的构造函数以及object类。
115 0
C#(二十一)之派生类中的构造函数 object类
|
JavaScript 前端开发
构造函数、原型、继承原来这么简单?来吧,深入浅出
构造函数、原型、继承原来这么简单?来吧,深入浅出
构造函数、原型、继承原来这么简单?来吧,深入浅出
|
设计模式 Java
Java的二十三种设计模式(原型模式(Prototype))
Java的二十三种设计模式(原型模式(Prototype))
65 0
|
C++ 编译器
读书笔记 effective c++ Item 41 理解隐式接口和编译期多态
1. 显示接口和运行时多态 面向对象编程的世界围绕着显式接口和运行时多态。举个例子,考虑下面的类(无意义的类), 1 class Widget { 2 public: 3 Widget(); 4 virtual ~Widget(); 5 6 virtual std::...
1077 0