A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 染墨的小白 中级黑马   /  2015-12-25 00:00  /  822 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

继承有两缺点:(1)当层级越来越多时,假如每个层级都有实例变量,那么最下层的子类继承的实例变量会超级多,沉重;(2)当消息传递自子类往上时,层级越多,效率越低下。
所以就有了组合。说实话区分继承和组合真不是那么容易。所谓两者是“is a"关系则是继承,两者是"has a"则是组合,还是模糊。其实,这两个概念无须区分十分明显,只需要记住:a)组合和继承实现的功能差不多,但是实现的形式不一样,记住各自的形式即可;b)尽量用组合。

下面举个例子,我们先创建一个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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马