【Objective-C 篇】 ☞ 6. 卷入、继承、组合以及聚集、多态

结缘及聚集

  类与类似里的同一种关系,相比较大;首要成效:代码复用!

1.1 什么是构成

  代表六只对象中是共同体与有的过人涉嫌,是“contains(包含) a”关系,要求少单近乎同生共死。

生命周期完全一致,同生共死。部分的生命周期无法跨越全部!

比如:一个窗口内发生按钮、标签,当窗口关闭时,窗口以及按钮、标签而灭绝。

 

1.2 组合的定义:

@interface BRButton : NSObject

@end

@interface BREdit : NSObject

@end

@interface BRWindow : NSObject

/**

 *  组合是两个类的强关系(要求定义成成员变量)

 *  1.在对象初始化时给实例变量赋值(同生共死)

 *  2.不能在类的外部对实例变量访问/赋值

 */

{

    BRButton *button;

    BREdit *edit;

}

@end

 

  组合Demo:

    C++ 1

    C++ 2

1.3 组合的优缺点:

优点:

1)当前目标只是可以透过所涵盖的很目的去调整用其形式,所以所包含的靶子的中间细节对当前目标是不可见的。

2)当前目的以及分包的目的是一个亚耦合关系,即便改动包含对象的近乎中代码,不欲修改时本着象类的代码。

3)当前目的足以以运行时动态的绑定所蕴涵的靶子。可以经过set方法让所蕴藏对象赋值。

缺点:

轻有了多之靶子

以能结成六只目标,必须仔细对接口举办定义。

 

1.4 什么是集结

表示两独对象中是共同体与组成部分的弱关系,是”has
a”关系,不求简单只类似同生共死。

生命周期不一致,一个类不可能控制另一个好像的存亡。部分的生命周期可以跨全体。

例如:电脑和鼠标,电脑给销毁时,鼠标可以留当其它总括机上继续拔取。

1.5 聚合的定义

@interface BRMouse : NSObject

@end

@interface BRComputer : NSObject

//聚合是两个类的弱关系,在类的外部给实例变量赋值(要求定义成属性)

@property BRMouse *mouse;

@end

 

  聚合Demo:

    C++ 3

1.6 聚合的得失:

优点:

1)被含有的对象通过包含它们的类来访问

2)很好的包装

3)被含有的目的中细节不可见

4)能够当运转时动态定义聚合的计

缺点:

1)系统或者汇合含有太多指标

2)当使用不同之目的时,必须小心定义之接口。

组成及集合的生命周期不相同,组合是同生共死(关系密不可分);聚合没有专门的涉及。

 

1.7  类与类似中常见的老二种植涉:继承、组合、聚合

  1) 继承(继承的根本目的:代码复用,制定标准,为了多态) 
慎用连续!(is a关系才用持续,否则滥用继承)

  2) 组合和聚众(单纯的为了代码复用)

          组合和汇聚的重要目标:是为着代码的复用。

   

动场景:(代码的重复使用。假设想使旁人的代码,组合、聚合在一起就得了)

实在支出中,假设为了复用代码,提倡使用组合或聚合来复用,而未用持续。即凡是将一个看似作为另外一个看似的性能。(全体以及部分)

 

一个类想使用此外一个近乎的法?怎么落实…

1.继续:我连续你,我虽足以一贯调你的艺术(进步程序的复杂度…不指出就此!)

2.结/聚合:把你变成自家之一律有(即你是自身的性质),我好因而拜访你去调整用而的法门![我.你 你的方];

 

做:关系非常连贯,同生共死。(cpu焊在主板及,主板坏了cpu也固然异常了;绑在同步同生共死!)

集:关系颇生疏,不同生共死。(总计机是电脑,cpu是cpu;这一个cpu能够为此让此统计机,也得就此为大统计机,cpu可以起主板及拔掉下来让其它一个处理器用)

面向对象的老三老特点: 封装, 继承, 多态

1. 封装

1.1 基本概念

拿零散的物组成起来。

  • 广义上封装指:将代码封装成函数,将实例变量和办法封装成类,将看似封装成框架….
  • 面向对象中之封装指:封装属性和道在一个对象吃,只让之外公开访问的接口,而且将具体落实藏起来。

1.2 封装的好处

增进可读性,可维护性,可增添性

1.3 OC中之包裹

OC语言天然就是是包好之。

概念一个好像时,@interface部分就是被外界公开之顾接口。@implementation部分就是藏起来的切实落实。

.h文件被写的凡当众之接口

.m文件被描写的是隐藏的兑现

//私有方法,只要非在头文件的接口部分表明的措施就是私有方法

2. 继承

2.1 概念

此起彼伏是一致栽代码复用技术(代码重复使用)。是近似与类似里的等同种关系(“is a”关系)。

B类继承了A类。A类为B类的父类,B类为A类的子类。

别语言中还有基类,派生类的定义

2.2 继承的法

    单继承  OC, Java…., 斯威夫特(Swift)(Swift)    单继承指一个近似只可以发出一个父类.

    多延续  C++匡助多累      多累指一个类似可有多单父类.

    OC语言中的接近以一如既往颗树上,只发一个祖先NSObject;
swift不只有同等粒树,是均等切开密林。

C++,2.3 OC中延续的语法

@interface 类名 : 父类名

 

@end

2.4 什么状态下用继承

理论上:

      倘若个别独像样里有着is a关系,这片单近乎应该是继续关系。

  狗是动物  Dog is a Animal.

        Animal是父类, Dog是子类

      倘使少单近乎中有has a关系,应该据此整合要聚合

  统计中生出一个CPU  Computer has a CPU

  组合以及聚合是另外一样种植恍若及类似中的干

实际开发被运用持续:

先勾勒的父类,依然先勾勒的子类?//都得

 

2.5 抽象类

C++: 纯虚函数,没有函数体的函数。存在纯虚函数的切近是抽象类,不可以实例化了目的。

Java: 抽象方法与抽象类, abstract来声称

OC: OC语言中从未抽象类和抽象方法的语法。

派生:在子类中上加新的特性和道

2.6 重写:子类对父类的措施无满意时,可重复写父类中之不二法门

          
隐藏:当子类更写父类的法子后,子类中将有半点个同名的点子,而从父类中继承的主意无克于类外被调用

2.6.1 概念

1) override 重写(覆盖): 子类不惬意由父类中继承来之法,重新以那么些方法实现了。

要求:方法名和父类一样,参数类型一样,重临值一样。唯有方法的贯彻非平等。

2) overload 重载: OC中连无在overload。

overload的定义是在一个克外(比如一个类中),出现三只章程名相同的章程,这个措施的参数类型不同,导致可以以出现,大家说,这些格局中形成了重载的涉。

OC中莫允和一个范围在多单办法名相同之不二法门。

-(id)initWithName:(NSString *)name andAge:(NSUInteger)age;

-(id)initWithName:(NSString *)name andGender:(BOOL)gender; //OC中方法名不同

OC中唯有重写,没有重载

法的重写:子类对父类继承的法门不乐意,可以于子类中还写父类的方。

要再写父类的道,优先调用子类的计,假使子类没有重写父类的措施,则调用父类的措施。

 

2.6.2 注意

即使如此父类中之性是堂而皇之的,但转变的实例变量却是私有的,在子类中不可知顾

2.6.3 普通方法的重写

如同perimeter, area, show

艺术名相同,参数类型相同,再次来到值相同

2.6.4 属性的重写

如同TRSqaure中的width,height属性

2.6.5 特殊措施的存续与重写

1) 起首化方法

于OC中着手化方法是会师让接续的。

此起彼伏来的伊始化方法有些可以据此,有些不克为此。

若在子类中,继承自父类的初阶化方法无可知为此(不可知成就要求的开首化任务),在子类中不怕需再写这起首化方法。

2) 类方法(工厂方法)

好像形式吗得以吃连续

工厂方法自然为堪叫持续,但一向接轨的工厂方法名不匹配,实际支付被丰硕少这样用。子类最好提供温馨的厂方法。

2.7 继承的毛病

  1) 提高了序的复杂度,维护性和扩张性降低。 

  2) 破坏类的封装性  慎用连续!

2.8 为什么以持续?

  1) 代码复用 

    将子类重复的代码抽象到父类中

  2) 制定正规(规则)

    NSObject  

  3) 为了多态

    没有继承,就一直不多态

3. 多态(Polymorphism)

3.1 什么是多态

又形态,引用的多形象。对于一个引用变量,可以对任何像样的目的 (一个对外接口,多独内在实现)

 

    父类的援指向本类或其他子类的对象,会调用不同的法子(表现来强象,这种表现为多态)

TRAnimal *animal = [[TRDog alloc]init];//父类的引用指向子类的对象

[animal eat];//狗啃骨头 (调用子类重写的方法)

animal = [[TRCat alloc]init];

[animal eat];//猫吃鱼

  
多态的变现:同一个引用变量s,调用相同之方(show),显示不同之结果。

TRShape *s=[[TRRect alloc]init]; //父类的引用指向子类的对象

[s show]; //显示矩形  调用子类重写的方法

s=[TRCircle alloc]init];

[s show]; //显示圆形

 

3.2 编译期类型和周转期类型

编译器编译时,引用的序列为编译期类型。

程序运行时,引用指向的门类为运行期类型。

      C++ 4 

  程序编译时依据编译期类型找法编译,程序运行时按照运行期类型找办法调用。

  父类的援指向子类的靶鸡时,只可以调用父类中有些艺术。

  因为编译器在编译时凡依据父类来检查的,固然运行时调用的凡子类的措施,不过编译时是按照父类来检查的。

3.3 为啥用多态

干什么用父类的援指向子类的目标:

为了写起更为可以因而(通用),兼容性更好之代码。

 

3.4 多态的各类表现【用途】

1)【参数多态】日常在术的参数表现多态:参数类型应用父类型,可以传任何子类的靶子

NSObject *暨id类型做呢艺术的参数区别在于:

NSObject *项目标援只可以调用NSObject类中有些艺术。

id类型的援得调用任何有(不克瞎写)的主意。

(一般不要NSObject *路,用id类型替代。id有高风险的,编译器根本不检讨对错)

/** 方法的参数 表现多态 */

void showAnimal(TRAnimal *animal) {

    [animal eat];

    [animal sleep];

    //[animal watchHome];//父类中没有这个方法编译不通过

}

int main() {

    @autoreleasepool {

        TRDog *dog = [[TRDog alloc]init];

        showAnimal(dog);

        showAnimal([TRCat new]);

    }

    return 0;

}

 

  2)【再次来到值多态】方法的归值达到表现多态

    C++ 5

3)【数组多态】在数组和汇中展现的多态

//数组 表现多态 [多个对象同时执行eat方法]

TRAnimal *animals[3] = {[TRAnimal new], [TRDog new], [TRCat new]};

for (int i = 0; i < 3; i++) {

[animals[i] eat];

}

  

 多态无处不在!

 

 

多态Demo

  C++ 6

    C++ 7

    C++ 8