这第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:类的继承的更多相关文章

  1. C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]

    面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...

  2. Java编程里类的继承

    今天,我们将要讨论的内容是Java里面类的继承的相关概念. 说到继承,我相信大家都不陌生.生活中,子承父业,子女继承父母的财产,这就是继承.实际上,Java里的继承也是如此.对于一个类来说,它的数据成 ...

  3. python自动化测试学习笔记-7面向对象编程,类,继承,实例变量,邮件

    面向对象编程(OOP)术语: class TestClass(object):   val1 = 100       def __init__(self):     self.val2 = 200   ...

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

    目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类 ...

  5. 3、二、c# 面向对像编程。类,结构、C# 数据类型(引用类型、值 类型、指针类型)、ref参数与out参数、方法的重载、静态类型与静态成员、继承与多态、委托与事件

    一.类 定义类使用class关键字. <access specifier> class class_name { // member variables 成员变量 <access s ...

  6. 面向对象编程(四)继承,概念及super关键字,final关键字,Object类常见方法

    继承 概念: ①   继承背后的思想就是基于已存在的类来构建新类; ②   当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求; ③   当从其它类导出的类叫作子 ...

  7. Objective-C编程 — 类和继承

    讲述面向对象中的一个重要概念——继承,使用继承 可以方便地在已有类的基础上进行扩展,定义一个具有父 类全部功能的新类. 父类和子类 我们在定义一个新类的时候,经常会遇到要定义的新类是某个类的扩展或者是 ...

  8. 【PHP面向对象(OOP)编程入门教程】11.类的继承

    继承作为面向对象的三个重要特性的一个方面,在面向对象的领域有着及其重要的作用,好像没听说哪个面向对象的语言不支持继承. 继承是PHP5面象对象程序设计的重要特性之一,它是指建立一个新的派生类,从一个或 ...

  9. JavaScript 面向对象的编程(三) 类的继承

    定义父类和子类的继承关系 //声明父类 function SuperClass(){ this.superValue = true; } //为父类添加共有方法 SuperClass.prototyp ...

随机推荐

  1. 【Android 应用程序开发】 Fragment 详细说明

    笔者 : 汉书亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38064191 本博客代码地址 : -- 单一 Fragmen ...

  2. centos7关闭防火墙(转)

    直接命令:service firewalld stop 1. Disable Firewalld Service. [root@rhel-centos7-tejas-barot-linux ~]# s ...

  3. 客户端上显示csdn上的各类别下的的文章列表 (制作csdn app 三)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23597229 今天将在Android 使用Fragment,ViewPagerI ...

  4. Android多点触控(图片的缩放Demo)

    本文主要介绍Android的多点触控,使用了一个图片缩放的实例,来更好的说明其原理.须要实现OnTouchListener接口,重写当中的onTouch方法. 实现效果图:       源码: 布局文 ...

  5. 水题 hdu1002------用BigInteger解决大数问题

    Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...

  6. RPG游戏学习——1.任务脚本系统

    [前言] 近期准备做个rpg小游戏,所以開始研究rpg的一些系统.rpg最核心的应该是任务脚本系统(其它脚本系统类似),在參考了非常多网上的资料后,简要总结例如以下. [脚本的触发运行] 一个脚本须要 ...

  7. 它们的定义PropertyPlaceHolder无法完成更换任务

    Spring默认PropertyPlaceholderConfigurer只能加载properties格风格简介,现在,我们需要能够从类的完整支持允许似hadoop格风格xml配置文件读取配置信息,并 ...

  8. 存储管理(两):openfiler它accounts

    存储管理(一个):openfiler演示和存储理解 openfiler的用户集中控制主要分为ldap和ad实现,当中openfiler本身可以作为ldapserver.使openfiler上的全部功能 ...

  9. oracle 解锁scott账户

    安装oracle数据库的时候忘了解锁账户,再加上一直配置不成功,链接不上,最后终于配置好了,发现没账户可用,oracle好难. oracle版本是 Oracle Database 11g Enterp ...

  10. JavaScript变量作用域和内存问题(二)

    执行环境是js中特别重要的概念,是指变量或者函数可以访问其他数据,定义自己的行为.每个执行环境都有一个与之相对应的变量对象,执行环境中定义的所有变量和函数都保存在这个变量中,我们看不到这个变量,但是后 ...