OC基础5:继承
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的《Objective-C程序设计第6版》过程中的笔记。
1、根类即是最顶层的类,父类也可称为超类;
2、关于实例变量的继承:
只有声明在@interface部分的实例变量才能被子类继承:包括在类名后马上使用花括号声明的变量和使用@property声明的变量,都可以继承。如果完全声明在@implementation部分的变量,则属于私有变量,需要提供方法才能访问。
3、每个实例都有自己的一套实例变量,即使这套实例变量是继承来的。比如bClass是从aClass继承来的,他们都有一个变量(int) n,那么当改变了aClass.a的值的时候,bClass.a的值不会随着改变。他们是两个不同的实例。
反观另一种特别的情况(代码8-5):Rectangle类是矩形类,XYPoint类是点类,Rectangle类里面包含了一个变量origin是(XYPoint *)类型的,用来存放这个矩形的位置点。新建了一个Rectangle类的实例myRect,新建了一个XYPoint类的实例myPoint,然后通过语句
myRect.origin= myPoint;
将myPoint的值赋给myRect作为它的位置点。这时候出现了一种情况,当myPoint的值改变了以后,myRect所包含的origin变量的值也跟着改变了。原因是使用上面的语句的时候,赋给origin变量的值并不是myPoint的内容,而是一个指针,指向了myPoint的存储位置,所以当myPoint的内容改变了以后,origin变量的值也跟着改变了,myRect并没有自己新建一套变量去存储myPoint的内容,存放的仅仅是一个指针。
对于这两种情况要区别去理解:aClass和bClass是两个不同的实例,各有各的变量;myRect并没有用一个变量去存储myPoint的内容,仅仅只用了一个(XYPoint *)类型的变量来存放了myPoint的指针。
4、对于3中的myRect和myPoint,只要在myRect里面重新声明了myPoint用以存放位置的几个变量,然后把myPoint里面对应的变量值一一赋给自己的变量,那么myPoint的值再怎么改变也不会再影响到myRect包含的位置点变量了。其实即是在myRect的内部声明一个myPoint,即有了一个私有的myPoint。
5、关于@class指令,比如在接口文件CClass.h中有如下代码段:
#import <Foundation/Foundation.h>
@class AClass
@interfaceCClass: NSObject
…
在这段代码中出现了指令@class,它的意思是接下来的代码中会使用到AClass这个类,这里告诉编译器接下来如果遇到“AClass”就把它当做一个类来对待即可。
但是如果下方代码要访问到Aclass包含的变量,那就会报错,这种情况应该把Aclass.h这个接口文件import进来。
6、关于4,其实不用再去声明XYPoint类的变量,只需要将Rectangle类中设置origin的方法改写如下即可:
-(void)setOrigin: (XYPoint *) pt {
if (! origin) { //如果origin是空的,则为false,那么(! origin)为true,执行以下代码;
origin = [[XYPoint alloc] init];
}
origin.x = pt.x; //x和y都是XYPoint的变量,这里origin是一个(XYPoint *)型的变量,
origin.y = pt.y; //它也会包含有一套xy,所以不需再去声明一套;
}
直接在方法中设置一套xy,就不会受myPoint影响。
这种情况下,虽然origin.x被赋予的仍然是pt.x的指针,但是也完全不需要担心会受到myPoint的影响的了,因为虽然现在origin.x和pt.x指向的是同一块内存,但是如果改变了pt.x的值的话,其实系统是新分配了一块内存写了一个新的值,然后让pt.x指向这块新的内存,origin.x指向的内存不会受到任何影响。
以下图为例:
(1)、origin = myPoint是这种情况:

(2)、origin.x = pt.x是这种情况:

7、在默认的情况下,合成(synthesize)的设值方法只是简单地复制对象的指针,而不是对象的本身,其实即是assign。
8、关于方法的覆写:
覆写的方法是一个同名的新方法,必须有相同的返回类型,并且参数的数目也不能改变。
OC基础5:继承的更多相关文章
- OC基础--继承
继承的基本概念: 现实生活中的继承: 人类是一个基类(也称做父类),通常情况下所有人类所共同具备的特性,如有手有脚能吃能喝 按照生活常规,我们继续给人类来细分的时候,我们可以分为学生类 工人类等,学生 ...
- 四.OC基础--1.文档安装和方法重载,2.self和super&static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&私有方法,6.description方法
四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 ...
- iOS 阶段学习第11天笔记(OC基础知识)
iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import 用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...
- OC基础笔记目录
OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...
- O-c中类的继承与派生的概念
什么是继承 众所周知,面向对象的编程语言具有: 抽象性, 封装性, 继承性, 以及多态性 的特征. 那么什么是继承呢? 传统意义上是指从父辈那里获得父辈留下的东西 在开发中, 继承就是"复用 ...
- OC基础 代理和协议
OC基础 代理和协议 1.协议 (1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法. (2)协议的使用步骤:制定协议-->遵守协议-->实现协议 ...
- OC基础 类的三大特性
OC基础 类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...
- OC基础 点语法的使用
OC基础 点语法的使用 1.创建一个Student类继承于NSObject,Student.h文件 #import <Foundation/Foundation.h> @interface ...
- OC基础17:归档
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.归档即是用某种格式把一个或多个对象保存 ...
随机推荐
- Randomized QuickSelect
In this blog, we give a solution for Quick Select. Here, we have an improvement. The idea is to rand ...
- 【转】基于V4L2的视频驱动开发
编写基于V4L2视频驱动主要涉及到以下几个知识点:1> 摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法.各种参数的配置方法.信号输出类型等.2> Camera解码器.控制器 ...
- JS~delegate与live
在jquery里有两个方法可以用来绑定自动追加出来的DOM对象,它们是live和delegate,事实上,这两个方法是bind方法的一个变体,在对于固定DOM对象时,我们通常使用bind就可以了,而对 ...
- Alexandra and Prime Numbers(思维)
Alexandra and Prime Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- Oracle SQL函数之转换函数
chartorowid(c1) [功能]转换varchar2类型为rowid值 [参数]c1,字符串,长度为18的字符串,字符串必须符合rowid格式 [返回]返回rowid值 [示例] SQL> ...
- Eclipse 常用快捷键 (动画讲解)(转载)
http://www.cnblogs.com/TankXiao/p/4018219.html#fix 很详细呀/
- [Linked List]Partition List
Total Accepted: 53879 Total Submissions: 190701 Difficulty: Medium Given a linked list and a value x ...
- VB.NET 结构(Structure)和类(Class)的区别
类是我们用来构造 VB.NET 应用程序时的最基本的编程结构了. 那结构与类有什么相似之处与不同之处呢? 结构和类, 相同之处是都含有成员,包括构造函数.方法.属性.字段.常量.枚举和事件,都可以实现 ...
- web在线聊天系统。非ajax轮询
利用php的死循环和刷新缓冲区实现. 浏览器发送请求到PHP获取消息页面. php接收到来之浏览器请求后. 循环获取数据库里面的消息. 当存在消息的时候.PHP告诉浏览器.我有消息给你.你接受 ...
- Android 创建自定义布局
我们所有的控件都是继承至View类的,而所有的布局都是继承至ViewGroup的,所以我们也可以继承某个view类来实现我们自己的布局或者控件. 引入布局 我们新建一个title.xml的layout ...