从这一篇博文 开始,我们 会学到 一些关键的原理,正是 这些原理 使 面向对象编程 变得 强大。这些原理 都是 跟继承 有关的。在以前的博文当中,我 提到过 大类的概念。比如 轿车这类事物 属于 汽车这一大类,而 汽车这类事物 又属于 交通工具这一大类。所以 在objective-c当中,某类物件 可能属于 某一大类物件。如果 某类物件 不属于 任何一大类物件,那么 这类物件 就叫做 最底层的一类物件。你 可以 自己 创建 最底层的一类物件,这类物件 可以不属于 任何一大类物件。我们 一般 不 这样 做,我们 只需要 利用好 已有的物件类型。到目前 为止,我们 已经 创建过 一些物件类型了,这些类型的物件 都属于 最底层的一类物件,我们 称 其 为:NSObject。比如
这行语句中的Fraction这类物件 就是 NSObject这类最底层的物件中的一小类物件。如果 用 示意图 来表示,就是 这样的:
一旦 我们 创建出 一类新的物件,这类新物件 都会 从包含它的大类 继承 特定的属性。比如 交通工具这类事物 具有 需要动力这种属性,那么 交通工具这类事物中的汽车这一小类事物 就会继承 需要动力这种属性,而 包含在汽车这类事物中的小轿车这一小类事物 同样 也会继承 需要动力这种属性。同样的道理,在objective-c中 我们创建的新的类型的物件 都会继承 它所属的那一大类物件中的一些属性,比如 变量 和 措施。
下面 我 用 一个完整的程序 来展示 一类物件 是怎样 继承 它所属的那一大类物件中的属性的:
文件ClassA.h:
文件ClassA.m:
文件ClassB.h:
文件ClassB.m:
文件main.m:
在这个程序当中 我 先 创建了 ClassA这类物件,ClassA这类物件 属于 NSObject这一大类物件。然后 我 又 创建了 ClassB这类物件,ClassB这类物件 又 属于 ClassA这一大类物件。而 ClassA这类物件 包含了 个体变量x,并且 可以对 其中的个体 采取setInitialValue:这项措施。于是 任何一个ClassB类型的物件 都拥有 一个叫做x的变量,并且 我们 可以对 其 采取 setInitialValue:这项措施。比如 在主程序main()当中 我 创建了 一个ClassB类型的物件objectB。这个ClassB类型的物件objectB 拥有 一个名叫x的变量,并且 我 对 其 采取了 setInitialValue:这项措施,将 这个变量x 设定为 10:
因为 物件objectB 属于ClassB类型,所有的ClassB类型的物件 又都 属于ClassA类型,而 所有的ClassA类型的物件 都拥有 一个变量x,都可以 对 其 采取 setInitialValue这项措施,所以 我 才能够 对 ClassB类型的物件objectB 采取 setInitialValue这项措施。
这行语句 对 objectB这个物件 采取了 retriveValue:这项措施,将 这个物件的个体变量x的值 显示出来。我 来运行 这个程序,看 能不能得到 正确的结果。首先 需要 编译:
然后 输入 ./a.out 运行,得到 这样的结果:
这 说明了 objectB这个ClassB类型的物件 继承了 ClassA这类物件的两个属性:1、都 包含 变量x;2、可以 对 其 采取 setInitialValue:这项措施。
NSObject、ClassA 和 ClassB这三类物件的从属关系 可以用 下面这张图 来表示:
如果 你 创建 一类叫ClassC的物件,而 ClassC这类物件 属于 ClassB这一大类物件,那么 任何一个ClassC类型的物件 都会 继承到 ClassB、ClassC 和 NSObject这三类物件的属性。