OC学习-13什么是组合,它和继承是什么关系?
Posted wzzkaifa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC学习-13什么是组合,它和继承是什么关系?相关的知识,希望对你有一定的参考价值。
继承有两缺点:(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什么是组合,它和继承是什么关系?的主要内容,如果未能解决你的问题,请参考以下文章