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

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

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

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

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

 @interface Tire : NSObject
@end //Tire @implementation Tire
-(NSString *) description{
return (@"I am a tire. I last a while.");
}
@end

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

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

 @interface Engine : NSObject
@end @implementation Engine
-(NSString *) description {
return (@"I am an engine. Vroom!");
}
@end

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

 @interface Car : NSObject
{
Engine *engine;
Tire *tires[]; //四个轮子,定义一个四个数的数组。
}
-(void) drive;
@end // Car @implementation Car
-(id) init
{
if(self = [super init])
{
engine = [Engine new];
tires[] = [Tire new];
tires[] = [Tire new];
tires[] = [Tire new];
tires[] = [Tire new];
}
return (self);
} -(void) drive{
NSLog(@"%@",engine);
NSLog(@"%@",tires[]);
NSLog(@"%@",tires[]);
NSLog(@"%@",tires[]);
NSLog(@"%@",tires[]);
}
@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方法,代码如下:

 int main(int argc, const char * argv[])
{
Car *car;
car = [Car new];
[car drive];
return ;
}

  运行效果:

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

  1. Python基础教程学习笔记:第一章 基础知识

    Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入“p ...

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

    教程视频网盘共享:http://pan.baidu.com/s/1hrTrR5E 03-python基础.if判断 print 输出数据 print("hahahah")----- ...

  3. 匿名内部类--毕向东java基础教程学习笔记

    1.匿名内部类其实就是内部类的简写形式. 2.定义匿名内部类的前提: 该内部类必须继承一个类,或者实现一个接口. 3.匿名内部类的格式:new 父类名或接口名(){定义子类内容:} 4.其实匿名内部类 ...

  4. 内部类--毕向东Java基础教程学习笔记

    内部类的访问规则 1. 内部类可以直接访问外部类的成员,包括私有. 之所以可以直接访问外部类的成员,是因为内部类中持有外部类的引用,格式:外部类名.this 2.外部类要访问内部类,必须建立内部类对象 ...

  5. 异常处理——毕向东Java基础教程学习笔记

    1.异常:就是程序运行过程中出现的不正常情况. 异常的由来:问题本身也是日常生活中一个具体的事物,也可以通过java类的形式进行描述,并封装成对象.                        其实 ...

  6. 《嵌入式Linux基础教程学习笔记一》

    常用书目下载地址:http://www.cnblogs.com/pengdonglin137/p/3688029.html 第二章 1.进程上下文和中断上下文(Page20) 当应用程序执行系统调用, ...

  7. Objective-C基础教程学习笔记(附录)从Java转向Objective-C

    Java接口与Objective- C正式协议类似,因为它们都需要实现一组方法.Java具有抽象类,但Objective-C没有.Java具有类变量,但在Objective-C中, 可以使用文件范围内 ...

  8. Python基础教程学习笔记:第二章 列表和元组

    1.序列中元素的索引: 第一个元素索引是0,第二个是1,依次递增 最后一个元素索引是-1,倒数第二个是-2,依次递减 2.序列(Sequence)的种类: 列表(list).元组(tuple).字符串 ...

  9. PHP学习笔记六【方法-递归】

    <?php //递归 global $n;//定义全局变量 function abc($n) { if($n>2) { abc(--$n); } echo '$n='.$n.'<br ...

  10. Objective-c基础知识学习笔记

    Objective-c基础知识学习笔记(一) 一直有记录笔记的习惯.但非常久没分享一些东西了,正好上半年開始学习IOS了,如今有空写点.因开发须要,公司特意为我们配置了几台新MAC.还让我们自学了2周 ...

随机推荐

  1. 几种Unity运行平台的判断

    这里就介绍几种常见的,也是便于使用的几种平台判断的方法. 1.先说第一种,也是我用的顺手的一个.利用RuntimePlatform判断,API上的解释是[The platform applicatio ...

  2. webbench进行压力测试

    参考原文:http://www.vpser.net/opt/webserver-test.html webbench是Linux下的一个网站压力测试工具,最多可以模拟3万个并发连接去测试网站的负载能力 ...

  3. C宏替换优先级

    宏替换仅仅是简单的替换,它不会影响运算符优先级的,比如: #define DOUBLE(x) x+x int i = DOUBLE(5)*5; printf("%d", i); 相 ...

  4. Tensorflow 之finetune微调模型方法&&不同层上设置不同的学习率

    在不同层上设置不同的学习率,fine-tuning https://github.com/dgurkaynak/tensorflow-cnn-finetune ConvNets: AlexNet VG ...

  5. 如何使用Cassandra来存储time-series类型的数据

       Cassandra非常适合存储时序类型的数据,本文我们将使用一个气象站的例子,该气象站每分钟需要存储一条温度数据. 一.方案1,每个设备占用一行      这个方案的思路就是给每个数据源创建一行 ...

  6. Java代码常见的十种错误

    每一个程序员在编写代码的过程中都免不了出现错误或是小的失误,这些小的错误和失误往往使得程序员还得返工.那么,如何才能尽量避免这些错误的发生呢?笔者总结只有在日常的编写代码中总结出经验,在这篇文章中,笔 ...

  7. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十九):推送avro格式数据到topic,并使用spark structured streaming接收topic解析avro数据

    推送avro格式数据到topic 源代码:https://github.com/Neuw84/structured-streaming-avro-demo/blob/master/src/main/j ...

  8. 微软BI 之SSIS 系列 - 变量查询语句引起列输出顺序不一致的解决方法

    开篇介绍 这个问题来自于 天善BI社区,看了一下比较有意思,因为我自己认为在 SSIS中处理各种类型文件的经验还比较丰富(有一年的时间几乎所有ETL都跟文件相关),但是这个问题确实之前没有特别考虑过. ...

  9. .Net学习资料

    1.博客系列文章 (1)设计模式 吕震宇 设计模式 张逸:晴窗笔记 Design & Pattern 梦幻Dot Net  .Net设计模式 李会军          .NET设计模式系列文章 ...

  10. zabbix 创建主机、主机群组、监控第一台服务器

    前面介绍了zabbix服务器和zabbix agent的安装配置,今天使用zabbix监控第一台服务器. 1. 安装zabbix agent 在被监控的服务器上安装zabbix agent . 参考& ...