zoukankan      html  css  js  c++  java
  • 【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 (double)aWidth height:(double)aHeight;
    @end

    (4)ASRectangle.m

    #import "ASRectangle.h"
    @implementation ASRectangle
    @synthesize p,width,height; //千万别忘记
    -(id)initWithP:(ASPoint *)aP (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 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

  • 相关阅读:
    Java用freemarker导出word
    springMVC集成缓存框架Ehcache
    java爬虫入门--用jsoup爬取汽车之家的新闻
    基于全注解的SpringMVC+Spring4.2+hibernate4.3框架搭建
    spring aop实现日志收集
    ELK + kafka 日志方案
    大数据挖掘方案
    elasticsearch例子(crud + 分页)
    分类(category)是门学问
    英语单词辨异 —— 容易理解错的单词
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6798634.html
Copyright © 2011-2022 走看看