《objective-c基础教程》学习笔记(六)—— 复合方法

  今天我们要讲的复合,当然不是小情侣吵着分手,然后又在一起的复合。

  复合遵循一个合成复用原则,又称为组合或者聚合复用原则。该原则的内容是:尽量使用对象组合,而不是继承来达到复用的目的。用聚合可以使系统更加灵活,类与类之间的耦合度降低。在objective-c中,复合是指将多个组件组合在一起,配合使用,从而得到一个完整的作品。严格的说,只有对象之间的组合才是复合。类中的基本数据和结构型对象不算复合。

  继承复合,是类与类之间两种重要的关系。接下来,我们就借用书本上的例子来介绍下复合关系

  假如我们要构建一个简单的汽车模型,那么要有一个发动机(Engine)和四个轮子(Tire)。基本定义的代码如下:

首先,先定义和简单的实现Tire类。

1 @interface Tire : NSObject
2 @end //Tire
3
4 @implementation Tire
5 -(NSString *) description{
6     return (@"I am a tire. I last a while.");
7 }
8 @end

  在实现方法中的description没有定义,那么他是哪里来的呢?在Cocoa中,NSLog()可以使用%@格式说明符来输出对象,NSLog()将对象发送了description消息,然后对象的description方法生成一个NSString并将其返回。所以,在类中提供description方法,就可以自定义NSLog()。

  然后定义和简单的实现Engine类。

1 @interface Engine : NSObject
2 @end
3
4 @implementation Engine
5 -(NSString *) description {
6     return (@"I am an engine. Vroom!");
7 }
8 @end

  然后定义汽车(Car)类本身。

 1 @interface Car : NSObject
 2 {
 3     Engine *engine;
 4     Tire *tires[4]; //四个轮子,定义一个四个数的数组。
 5 }
 6 -(void) drive;
 7 @end // Car
 8
 9 @implementation Car
10 -(id) init
11 {
12     if(self = [super init])
13     {
14         engine = [Engine new];
15         tires[0] = [Tire new];
16         tires[1] = [Tire new];
17         tires[2] = [Tire new];
18         tires[3] = [Tire new];
19     }
20     return (self);
21 }
22
23 -(void) drive{
24     NSLog(@"%@",engine);
25     NSLog(@"%@",tires[0]);
26     NSLog(@"%@",tires[1]);
27     NSLog(@"%@",tires[2]);
28     NSLog(@"%@",tires[3]);
29 }
30 @end

  在实现Car类的代码中,我们定义了一个类型为id的init的方法。这里的作用是:初始化实例变量,创建1个engine变量和4个tire变量。使用new创建新对象的时候,系统会自动给对象分配内存,然后自动调用init方法,使该对象进入可以使用的状态。

  关于init方法中,if语句:if(self = [super init]),这个条件是什么意思呢?为了让超类(在这里是指:NSObject)将所有需要的初始化工作一次性完成。需要调用[super init]。init方法的返回值(id类型数据,即泛型对象指针)就是被初始化的对象。而将返回的结果赋值给self则是Objective-c的惯例。这样做是为了防止超类在初始化过程中返回的对象与一开始创建的不一致。

  最后在main主函数中,创建一个Car对象,然后调用drive方法,代码如下:

1 int main(int argc, const char * argv[])
2 {
3     Car *car;
4     car = [Car new];
5     [car drive];
6     return 0;
7 }

  运行效果:

时间: 2024-12-17 23:46:15

《objective-c基础教程》学习笔记(六)—— 复合方法的相关文章

<<Python基础教程>>学习笔记之|第01章|基础知识

本学习笔记主要用要记录下学习<<Python基础教程>>过程中的一些Key Point,或自己没怎么搞明白的内容,可能有点杂乱,但比较实用,查找起来也方便. 第01章:基础知识 ------ Jython:      Python的Java实现,运行在JVM中,相对稳定,但落后于Python,当前版本2.5,在TA(Python+Robot)会用到 IronPython:  Python的C#实现,运行在Common Language Runtime,速度比Python要快 >

01 3dmax基础教程学习笔记

学习笔记,如有错误请留言,谢谢 01 3dsmax界面介绍 02 界面UI布局 03 查看视点 04 视点显示控制 05 选择方法

jquery基础教程学习笔记一

最近静下心来看书才深刻的体会到:看书真的很重要,只有看书才能让你有心思静下心来思考. 重温<jquery基础教程> 一.事件 主要掌握常见的事件以及理解jquery的事件处理机制. 需要注意的有: 1.事件传播,包括了事件捕获和事件冒泡,以及怎么消除事件传播的影响,以及应用事件传播. 主要的方法有:a.根据事件目标来确定操作,即event.target b.阻止事件传播,即event.stopPapogation c.理解默认事件和jquery事件的区别还有阻止默认事件,即preventDef

【学习笔记】Python基础教程学习笔记

教程视频网盘共享:http://pan.baidu.com/s/1hrTrR5E 03-python基础.if判断 print 输出数据 print("hahahah")------>hahahah a = 100 print(a)----->直接打印a的值 a = 18 print("我的年龄是%d岁"%a)------>我的年龄是18岁 age = 18 high = 178 print("我的年龄是%d岁,我的身高是%dcm&quo

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第13章 | 数据库支持

备注:这章内容相对介绍的比较简单,不过例子比较使用,主要是要掌握如果连接,使用数据库,并以SQLite做示例 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,现在已经通过了一个标准的DB API.目前的API版本(2.0)定义在PEP249中的Python Database API Specification v2.0中. 异常 为了尽可能准确地处理错误,API中定义了一些异常.它们被定义在一种层次结构中,所以可以通过一个except块捕捉多种异常. 连

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简单的模块 #hello.py print ("Hello,World!") >>> import hello Traceback (most recent call last): File "<pyshell#56>", line 1, i

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第05章 | 条件、循环和其他语句

第05章 | 条件.循环和其他语句 ------ print 和 import #如果要打印多个语句,用,分割 >>> print "Name is:","Sherry.","Age is:",40 Name is: Sherry. Age is: 40 >>> print (1,2,3) #如果要打印元祖 (1, 2, 3) >>> print 1,2,3 #print语句会在每个元素间插入

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第14章 | 网络编程

Python是个很强大的网络编程工具,原因有二: 1. Python内有很多针对常见网络协议的库 2. Python在处理字节流方面的优势 本章主要内容: 探讨Python标准库中的一些网络模块,探讨SocketServer类,最后是Twisted框架. ------ 相关模块 Socket模块 基本组件,用于两个程序之间的信息通道.套接字包括两个: 服务器套接字和客户端套接字.创建一个服务器套接字后,让它等待连接,这样它就在某个网络地址处监听.客户端套接字负责:简单的连接,完成事务,断开连接.

python基础教程学习笔记---(1)基础语法

1.两个整数相除,计算结果的小数部分被截除,结果仍然是一个整数: 如:1/2=0 2.整数和浮点数相除.或者浮点数之间相除,结果有小数部分,仍然是一个浮点数: 如:1/2.0=0.5  1.0/2=0.5  1.0/2.0=0.5  1/2.=0.5 3.双斜线(//)定义整除运算 如:1.0//2.0=0.0  1//2=0 4.%定义取余运算(求模运算) 如:10%3=1  2.75%0.5=0.25 5.**定义幂运算(乘方运算) 如:2**3=8  -3**2=-9 6.输入16进制表达