ojective-C学习笔记(6)复合
通过之前的学习,知道了继承是在两个类之间建立关系的一种方式,它可以避免许多重复的代码。
使用复合可以组合多个对象,让它们分工协作。事实上,我们经常同时使用继承和复合来创建自己的类,掌握两个概念十分重要。
下面通过一个小程序来了解复合是什么。
//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)复合相关推荐
- Go圣经-学习笔记之复合类型(二)
2019独角兽企业重金招聘Python工程师标准>>> 上一篇 Go圣经-学习笔记之复合类型 下一篇 Go圣经-学习笔记之复合数据结构(三) map介绍和简单使用 map是一种无序的 ...
- 【C++学习笔记】复合类型和const限定符
一.复合类型 复合类型(compound type)是指基于其他类型定义的类型.本次主要介绍引用和指针两种. 1.1 引用 引用(reference)为对象起了另外一个名字,引用类型引用(re ...
- 【C++ Primer】第四章学习笔记 (复合类型)
一,数组 1,数组只有在定义时候才能使用初始化,不能将一个数组赋给另一个数组. int a[4]={1,2,3,4};//正确 int a[4 ...
- Go圣经-学习笔记目录
2019独角兽企业重金招聘Python工程师标准>>> 第一章 入门 Go圣经-学习笔记入门 Go圣经-学习笔记绪论 Go圣经-学习笔记入门-面试题 Go圣经-学习笔记入门bufio ...
- 《Go语言圣经》学习笔记 第四章 复合数据类型
<Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...
- C++ Primer Plus 学习笔记(第 4 章 复合类型)
C++ Primer Plus 学习笔记 第 4 章 复合类型 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 要创建数组,可使用声明语句.数组声明应指出以下三点: 存储在每个元素的 ...
- mysql select语句详解_mysql学习笔记之完整的select语句用法实例详解
本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...
- 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)
Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...
- ElasticSearch 6.x 学习笔记:12.字段类型
ElasticSearch 6.x 学习笔记:12.字段类型 欢迎转载. https://blog.csdn.net/chengyuqiang/article/details/79048800 12. ...
- Hadoop学习笔记(8) ——实战 做个倒排索引
Hadoop学习笔记(8) --实战 做个倒排索引 倒排索引是文档检索系统中最常用数据结构.根据单词反过来查在文档中出现的频率,而不是根据文档来,所以称倒排索引(Inverted Index).结构如 ...
最新文章
- [20160910]低级错误.txt
- Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】...
- python流程控制语句-python学习 流程控制语句详解
- pythonos基础_python基础之模块之os模块
- 关键字—修饰方法、类、属性和变量的关键字(共9个)
- 基于android 定位系统,基于Android平台定位系统设计和实现
- 清华大学-美团数字生活联合研究院成立
- 吴恩达深度学习5.1笔记_Sequence Models_循环序列模型
- pandas表字段为空用其余表替换
- CentOS中自定义yum仓库和配置文件
- spring mybatis 项目源码
- Kafka权威指南,Kafka生产者
- sqlmap安装及问题汇总
- java 游戏编程 (一)
- python猴子分桃子的数学题_python编程练习-分桃子
- 缠论三大套利技术模型
- AFEchidna示例8--固定效应显著性检验
- 「可视化搭建系统」——从设计到架构,探索前端领域技术和业务价值
- 如何发布一款Android应用到安卓市场
- 利用yolov7训练自己的数据集; yolov7的安装与使用 ; yolov7源码解读