继承有两缺点:(1)当层级越来越多时,假如每一个层级都有实例变量,那么最下层的子类继承的实例变量会超级多,沉重。(2)当消息传递自子类往上时。层级越多,效率越低下。

所以就有了组合。说实话区分继承和组合真不是那么easy。所谓两者是“is a"关系则是继承,两者是"has a"则是组合,还是模糊。事实上。这两个概念无须区分十分明显,仅仅须要记住:a)组合和继承实现的功能几乎相同,可是实现的形式不一样,记住各自的形式就可以;b)尽量用组合。

很多其它差别详见:http://socket.blog.163.com/blog/static/20987300420099238350634/

以下举个样例。我们先创建一个ASPoint类,记录x和y坐标值。然后再创建一个ASRectangle类。记录这个长方形在坐标轴上得左下角坐标以及宽和高,这里面的左下角坐标就能够用ASPoint类的一个对象来表示。所以说ASPoint类的一个对象是ASRectangle组合的一个部分。

(1)ASPoint.h

#import <Foundation/Foundation.h>
@interface ASPoint : NSObject
//声明x和y属性
@property(nonatomic) double x;
@property(nonatomic) double y;
-(id)initWithX:(double)aX Y:(double)aY;
@end

(2)ASPoint.m

#import "ASPoint.h"
@implementation ASPoint
@synthesize x,y; //千万别忘记
-(id)initWithX:(double)aX Y:(double)aY{
if (self=[super init]) {
x=aX;
y=aY;
}
return self;
}
@end

(3)ASRectangle.h

#import <Foundation/Foundation.h>
//由于我们须要使用的时类对象,所以仅仅须要导入类。让后面在用它时编译不会出错就可以
@class ASPoint;
@interface ASRectangle : NSObject
//ASRectangle类一共三实例变量,当中坐标这个还是取自ASPoint类的对象
@property(nonatomic,retain) ASPoint*p;
@property(nonatomic) double width;
@property(nonatomic) double height;
-(id)initWithP:(ASPoint *)aP width:(double)aWidth height:(double)aHeight;
@end

(4)ASRectangle.m

#import "ASRectangle.h"
@implementation ASRectangle
@synthesize p,width,height; //千万别忘记
-(id)initWithP:(ASPoint *)aP width:(double)aWidth height:(double)aHeight{
if (self=[super init]) {
p=aP;
width=aWidth;
height=aHeight;
}
return self;
}
@end

(5)main.m

#import <Foundation/Foundation.h>
//须要导入两个头文件
#import "ASPoint.h"
#import "ASRectangle.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
ASPoint * p1=[[ASPoint alloc]initWithX:20 Y:20]; //先把左下角那个对象创建出来,后面用到
ASRectangle * rec=[[ASRectangle alloc]initWithP:p1 width:30 height:15]; //创建这个类时,左下角坐标直接用上面创建出的对象p1
NSLog(@"%g,%g",rec.p.x,rec.p.y); //rec有p这个变量,即对象。而p有x和y变量,所以一层层点调用
}
return 0;
}

(6)结果:输出x和y坐标值

//就是创建这个对象时初始化赋的值
20,20

【OC学习-13】什么是组合,它和继承是什么关系?的更多相关文章

  1. OC学习13——Foundation框架中的集合

    OC集合类是一些非常有用的工具类,它可以用于存储多个数量不等的对象,并可以实现常用的数据结构(栈.队列等),此外,OC集合还可用于保存具有映射关系的关联数组.OC的集合大致可以分为:NSArray.N ...

  2. 【OC学习-12】什么是类的继承?为什么要继承?以及继承里面的注意事项

    (1)怎样实现类的继承? //之前的继承根类,如类ASStudent继承自根类 @interface ASStudent:NSObject{ } @end //如今继承现有自己定义的类,如ASStud ...

  3. OC学习9——反射机制

    1.OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作. 通过NSObject类中定义的方法进行动态编程:因为绝大 ...

  4. JavaScript学习13 JavaScript中的继承

    JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...

  5. OC学习总结之面向对象和类

    OC学习总结之面向对象和类   Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程  面向对象和面向过程是编程的两种思考方式.面向对象 ...

  6. ThinkPhp学习13

    原文:ThinkPhp学习13 简单登录验证 创建Login类 <?php class LoginAction extends Action { function index(){ $this- ...

  7. IOS开发-OC学习-常用功能代码片段整理

    IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...

  8. OC学习16——对象归档

    转载自  OC学习篇之---归档和解挡 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOutputStream来进行操作的.当然在操作的这些对象都 ...

  9. OC学习11——循环引用与@class

    转载自 OC学习篇之---@class关键字的作用以及#include和#import的区别 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#in ...

随机推荐

  1. SQLSERVER调用DLL程序

    在SQL Server中调用dll分为两个步骤 1.创建一个dll文件(dll文件分成3种类型,讲其中一种) 2.把dll文件放进SQL Server的程序集中.然后定义一个Function,就可以通 ...

  2. Sqoop操作实践

    Sqoop操作实践 @(Hadoop) Sqoop常用参命令 序号 命令/command 类 说明 1 impor ImportTool 从关系型数据库中导入数据(来自表或者查询语句)到HDFS中 2 ...

  3. vim删除文本文件中末行^M

    ^M字符的来历和作用:在DOS/Windows里,文本文件的换行符为\r\n,而在*nix系统里则为\n,所以DOS/Windows里编辑过的文本文件到了*nix里,每一行都多了个^M.所以^M只是一 ...

  4. windows下curl报错:curl : (1) Protocol https not supported or disabled in libcurl

    如果命令语句中有单引号,改为英文双引号试一下

  5. 【測试工具】一个将Unix时间转换为通用时间的工具

    一个将Unix时间转换为通用时间的工具 演示效果: 点击转换之后变为: 源码: function calctime2(){ var time = window.document.getElementB ...

  6. SpringMVC整合quartz,实现定时任务

    <dependency>        <groupId>org.quartz-scheduler</groupId>        <artifactId& ...

  7. fastestmirror不能使用

    fastestmirror不能使用,fastestmirror是yum的一个加速插件 处理办法就是禁用这个插件 方法两种 第一种 vi /etc/yum/pluginconf.d/fastestmir ...

  8. C# 关键字 Visual Studio 2012

    C# 关键字 Visual Studio 2012 其他版本 关键字是对编译器具有特殊意义的预定义保留标识符. 它们不能在程序中用作标识符,除非它们有一个 @ 前缀. 例如,@if 是有效的标识符,但 ...

  9. Android开发之JNI(一)--HelloWorld及遇到的错误解析

    Android开发之JNI(一)--HelloWorld及遇到的错误解析 1.NDK环境搭建    參考http://blog.csdn.net/xiaoliouc/article/details/8 ...

  10. vlan 介绍

    简介      在Linux中安装了802.1Q标签VLAN功能.VLAN是虚拟分配以太网的功能. 使用VLAN ID从物理上将一个以太网分割开.在VLAN环境下,具有相同VLAN ID 就可以相互通 ...