继承有两缺点:(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. iOS:扩展UIColor,支持十六进制颜色设置

    来自转载:http://my.oschina.net/leejan97/blog/307491 摘要: 可以直接使用十六进制设置控件的颜色,而不必通过除以255.0进行转换 #define UICol ...

  2. Centos6.5搭建RHCS集群-实现GFS+iSCSI网络共享存储

    RHCS集群配置 需要用到的各组件功能:RHCS(Red Hat Cluster Suite):能够提供高可用性.高可靠性.负载均衡.存储共享且经济廉价的集群工具集合.LUCI:是一个基于web的集群 ...

  3. 基于3D Vision眼镜的OSG立体显示 【转】

    http://blog.csdn.net/qq_20038925/article/details/50510565 OSG 立体显示 3D Vision眼镜:所实现的是被动立体. 1.本人最近在做os ...

  4. java源码阅读System

    1类签名与注释 public final class System System类包含一些有用的类属性和方法.该类不能被实例化,所以其所有属性与方法都是static的. 2标准输入输出流 public ...

  5. 简单工厂模式 SimpleFactory

     简单工厂模式 SimpleFactory 1.1什么是简单工厂设计模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模 ...

  6. 【Git】Git hangs while unpacking objects (Windows)

    Git hangs while unpacking objects (Windows) 14 Oct 2014 I'm not sure if this is because we're behind ...

  7. Gitlab安装部署及基础操作

      环境说明 系统版本 CentOS 7.2 x86_64(较新版本的gitlab集成了更多功能,顺利运行起来的硬件要求较高,这里给了3G内存) 软件版本 gitlab-ce-10.8.4 GitLa ...

  8. MS project 使用小技巧收集

    如何使用的url: http://www.cnblogs.com/wangfupeng1988/p/3648994.html  (好文,易上手) 一.  如何设置周末为工作日. 1. 在 “工具”-& ...

  9. 最小生成树之Prim(普里姆)算法

    关于什么是Prim(普里姆算法)? 在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网, 则连通n个城市仅仅须要n-1条线路.这时.我们须要考虑这样一个问题.怎样在最节省经 ...

  10. FBX导入错误 :ImportFBX Errors:

    原地址:http://www.cnblogs.com/lopezycj/archive/2012/05/16/unity3d_tuchao.html Unity3D吐槽1--FBX导入 Unity3d ...