通过之前的学习,知道了继承是在两个类之间建立关系的一种方式,它可以避免许多重复的代码。

使用复合可以组合多个对象,让它们分工协作。事实上,我们经常同时使用继承和复合来创建自己的类,掌握两个概念十分重要。

下面通过一个小程序来了解复合是什么。

//Tire类
@interface Tire : NSObject@end@implementation Tire- (NSString *)description
{return [NSString stringWithFormat:@"I am a tire."];
}@end//Engien类
@interface Engine : NSObject@end@implementation Engine- (NSString *)description
{return [NSString stringWithFormat:@"I am an engien."];
}@end//Car类,一辆汽车有一个引擎和4个轮子。
@interface Car : NSObject{Engine *engien;Tire *tires[4];
}- (void)print;@end@implementation Car- (instancetype) init{if(self = [super init]){engien = [Engine new];tires[0] = [Tire new];tires[1] = [Tire new];tires[2] = [Tire new];tires[3] = [Tire new];}return self;
}- (void)print{NSLog(@"%@", engien);NSLog(@"%@", tires[0]);NSLog(@"%@", tires[1]);NSLog(@"%@", tires[2]);NSLog(@"%@", tires[3]);
}@end//main函数int main(int argc, const char * argv[]) {Car *car = [[Car alloc] init];[car print];return 0;
}

输出结果为:

2018-04-21 20:00:26.610274+0800 Car[5750:735664] I am an engien.
2018-04-21 20:00:26.610512+0800 Car[5750:735664] I am a tire.
2018-04-21 20:00:26.610535+0800 Car[5750:735664] I am a tire.
2018-04-21 20:00:26.610548+0800 Car[5750:735664] I am a tire.
2018-04-21 20:00:26.610558+0800 Car[5750:735664] I am a tire.

上面的程序十分简单,可以添加一些存取方法让程序变得更加完善。

下面为Car添加一些setter和getter方法:

- (Engine*)engine{return engien;
}- (void)setEngiene:(Engine *)newEngine{engien = newEngine;
}- (Tire *)tireAtIndex:(int)index{if (index < 0 || index > 3){NSLog(@"error index (%d) in setTire:atIndex:", index);exit(1);}return tires[index];
}- (void)setTire:(Tire *)tire atIndex:(int)index{if (index < 0 || index > 3){NSLog(@"error index (%d) in setTire:atIndex:", index);exit(1);}tires[index] = tire;
}

将main函数改为如下形式:

int main(int argc, const char * argv[]) {Car *car = [Car new];[car setEngiene:[Engine new]];for(int i = 0; i< 4; i++){[car setTire:[Tire new] atIndex:i];}[car print];return 0;
}

程序的运行结果并没有任何改变。

可以继续扩展上面的程序,创建Engine和Tire的子类,生成新型的引擎和轮子,组装更加豪华的汽车。这个程序同时用到了复合和继承。

复合还是继承?

学完了复合和继承,那么什么时候用复合,什么时候用继承呢?

继承的类之间建立的关系是“is a”(是一个),而复合的类之间建立的关系是“has a”(有一个)。

转载于:https://www.cnblogs.com/ccyag/p/8903490.html

ojective-C学习笔记(6)复合相关推荐

  1. Go圣经-学习笔记之复合类型(二)

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇 Go圣经-学习笔记之复合类型 下一篇 Go圣经-学习笔记之复合数据结构(三) map介绍和简单使用 map是一种无序的 ...

  2. 【C++学习笔记】复合类型和const限定符

    一.复合类型   复合类型(compound type)是指基于其他类型定义的类型.本次主要介绍引用和指针两种. 1.1 引用   引用(reference)为对象起了另外一个名字,引用类型引用(re ...

  3. 【C++ Primer】第四章学习笔记 (复合类型)

    一,数组      1,数组只有在定义时候才能使用初始化,不能将一个数组赋给另一个数组.            int  a[4]={1,2,3,4};//正确            int  a[4 ...

  4. Go圣经-学习笔记目录

    2019独角兽企业重金招聘Python工程师标准>>> 第一章 入门 Go圣经-学习笔记入门 Go圣经-学习笔记绪论 Go圣经-学习笔记入门-面试题 Go圣经-学习笔记入门bufio ...

  5. 《Go语言圣经》学习笔记 第四章 复合数据类型

    <Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...

  6. C++ Primer Plus 学习笔记(第 4 章 复合类型)

    C++ Primer Plus 学习笔记 第 4 章 复合类型 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 要创建数组,可使用声明语句.数组声明应指出以下三点: 存储在每个元素的 ...

  7. mysql select语句详解_mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...

  8. 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)

    Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...

  9. ElasticSearch 6.x 学习笔记:12.字段类型

    ElasticSearch 6.x 学习笔记:12.字段类型 欢迎转载. https://blog.csdn.net/chengyuqiang/article/details/79048800 12. ...

  10. Hadoop学习笔记(8) ——实战 做个倒排索引

    Hadoop学习笔记(8) --实战 做个倒排索引 倒排索引是文档检索系统中最常用数据结构.根据单词反过来查在文档中出现的频率,而不是根据文档来,所以称倒排索引(Inverted Index).结构如 ...

最新文章

  1. [20160910]低级错误.txt
  2. Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】...
  3. python流程控制语句-python学习 流程控制语句详解
  4. pythonos基础_python基础之模块之os模块
  5. 关键字—修饰方法、类、属性和变量的关键字(共9个)
  6. 基于android 定位系统,基于Android平台定位系统设计和实现
  7. 清华大学-美团数字生活联合研究院成立
  8. 吴恩达深度学习5.1笔记_Sequence Models_循环序列模型
  9. pandas表字段为空用其余表替换
  10. CentOS中自定义yum仓库和配置文件
  11. spring mybatis 项目源码
  12. Kafka权威指南,Kafka生产者
  13. sqlmap安装及问题汇总
  14. java 游戏编程 (一)
  15. python猴子分桃子的数学题_python编程练习-分桃子
  16. 缠论三大套利技术模型
  17. AFEchidna示例8--固定效应显著性检验
  18. 「可视化搭建系统」——从设计到架构,探索前端领域技术和业务价值
  19. 如何发布一款Android应用到安卓市场
  20. 利用yolov7训练自己的数据集; yolov7的安装与使用 ; yolov7源码解读

热门文章

  1. centos7中firewall防火墙命令详解
  2. 解决 react-router 中 history is 'undefined' 的问题
  3. Sql Server之旅——第二站 理解万恶的表扫描
  4. Java 加密解密之对称加密算法PBE
  5. Dell™ PowerEdge™ R710机架式服务器旨在成为虚拟化企业的构建块
  6. sql2005各种版本
  7. 软件测试——检查代码
  8. Typora使用技巧--不定期更新
  9. Appium真机运行Device Name获取方法
  10. Django之ModelForm使用