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;
}
时间: 2024-10-25 09:08:40

obj-c编程04:类的继承的相关文章

Python 进阶_OOP 面向对象编程_类和继承

目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类属性方法的命名规则 类 类是实例的抽象, 实例是类的具体化. Python 中的类分为 经典类 和 新式类. 前者现在已经很少用到了, 其特点就是可以不需要继承任何父类:后者则刚好相反, 形式类必须至少有一个父类, 如果没有特定的父类需要继承时, 至少需要继承基类 object, 在后面给出例子.

【C/C++学院】0822-类型转换函数与构造转换函数/类的继承/类的继承以及区别/继承静态成员与静态函数//继承实现代码重用/单继承QT案例/多继承简介以及实战/Gpu编程

类型转换函数与构造转换函数 #include<iostream> class fushu { public: explicit fushu(int num)//避免隐式转换,引发歧义 { x = num; y = num; } void print() { std::cout << x << "+" << y << "i" << std::endl; } operator int(); //不支

java类的问题-java编程,有关类的继承,方法的覆盖等

问题描述 java编程,有关类的继承,方法的覆盖等 类Citizen,拥有identityCardNumber(String).name(String).gender(char).birthPlace(String).birthday(java.util.Date)属性,构造方法Citizen(String identityCardNumber, String name, char gender).Citizen(String identityCardNumber, String name, c

C#体验编程技术 类与对象

编程|对象 组件编程不是对传统面向对象的抛弃,相反组件编程正是面向对象编程的深化和发展.类作为面向对象的灵魂在C#语言里有着相当广泛深入的应用,很多非常"Sharp"的组件特性甚至都是直接由类包装而成.对类的深度掌握自然是我们"Sharp XP"重要的一环. 类 C#的类是一种对包括数据成员,函数成员和嵌套类型进行封装的数据结构.其中数据成员可以是常量,域.函数成员可以是方法,属性,索引器,事件,操作符,实例构建器,静态构建器,析构器.我们将在"第五讲 构

在JavaScript中模拟类(class)及类的继承关系_javascript技巧

Javascipt语法不支持"类"(class)[es6已经支持],但是有模拟类的方法.今天我主要谈谈Javascipt中模拟"类"的方法及js中继承的总结和回顾. js中实现"类"与继承,既是重点,又是难点.很多同学可能都对js中"类"与继承都有所了解,但是深入剖析的时候,感觉力不从心.模棱两可. 我们先来总结一下js定义"类"的几种方法: 方法一:构造函数法 这个方法是比较经典的方法,我们会经常见到.生

类的继承(Inheritance)

vb.net支持类的继承,允许用户定义一个类,作为其他类继承的依据,继承类能够继承.扩充基本类的属性和方法,继承类也可以重载基本类的一些方法,所有在Vb.net中建立的类缺省的属性都是可继承的.因为窗体现在看成了一个类,所以在vb.net中用户可以根据现有的窗体继承出一个新的窗体. 继承的一个目的就是使代码可以重用.有两种方法可以提高代码的重用率,合成(composition)和继承(Inheritance),一直以来,Visual Basic都支持合成这种方法来达到代码的重用,用户可以建立和重

C++类的继承与多重继承的访问控制

在前面的练习中我们一直在使用public的继承方式,即共有继承方式,对于protected和private继承方式,即保护继承与私有继承方式我们并没有讨论. 对于单个类来说,讨论保护继承与私有继承的区别意义是不大的,他们的区别只在多级继承的情况中体现. 在这里我声明一下,对于此章节的内容不太适合用过多的文字进行描述,主要还是看例子,通过例子熟悉之间的关系,过多的文字描述会模糊读者思路. 例程如下(重要部分都做了详细说明): //程序作者:管宁//站点:www.cndev-lab.com//所有稿

【C/C++学院】0817-递归汉诺塔 双层递归 /CPP结构体 /面向过程与面向对象的编程模式/类的常识共用体实现一个类的特征/QT应用于类以及类的常识

递归汉诺塔 双层递归 #include <iostream> void han(int n, char A, char B, char C) { static int num = 1; std::cout << "第" << num << "次"; num++; if (n<1) { return; } else { han(n - 1, A, C, B); std::cout << A <&l

ExtJS入门之一 类与继承

在项目中使用ExtJS已经有一段时间了, 对于这个庞大的Script类库有了一定的了解, 在Ext的使用上也有了一定的经验, 现将这些经验做一下总结, 作为一个入门材料给大家分享. 对于Ext库, 不要被它的庞大所吓倒, 只要静下心来看SDK, 多做一些练习, 还是很容易上手的. ExtJS 中的类与继承   在Ext下, 定义一个JavaScript类似乎没有什么特别的, 可以直接声明一个构造函数, 并使用关键字new来进行初始化. 有一点值得注意的是在Ext中频繁出现的Singleton类,