目录:

一、继承的缺陷

二、为什么使用继承

三、组合和聚合

四、多态

回到顶部

一、继承的缺陷

1 提高了程序的复杂度,维护性和扩展性低

2 破坏了类的封装性

回到顶部

二、为什么使用继承

1 代码复用、制定规则、为了多态

回到顶部

三、组合和聚合

1 复用代码更好的方式是组合和聚合,而不是继承。

2 组合和聚合也是类与类之间"has a"的关系

组合好比一体机,聚合好比台式机兼容好

3 继承是继承一个类,而组合和聚合类之间是相互独立的,都继承NSObject

4 组合

优点:*保留了封装性*操作便利

缺点:*灵活度不够

生命周期:cpu和computer封装性是独立的,生命周期是一致的,一起存在,一起销毁,高耦合在一起

5 聚合

优点*保留了封装性*灵活度高

缺点:*操作欠佳

生命周期:cpu和computer生命周期不一致,低耦合,方便操作,方便cpu替换,两个对象,各过各的。

组合关键代码:

 main.m中
//组合关系(一体机)
Computer2* computer2 = [[[Computer2 alloc] init] autorelease];//在初始化时cpu已经设置好了
[computer2 powerOn]; computer.m中,类实现文件
//init
-(id)init{
if (self = [super init]) {
self.cpu = [[[TRCpu2 alloc] init] autorelease];
}
return self;
}

聚合关键代码:

 main.m中
//聚合关系(台式机)
TRCpu3* cpu = [[[TRCpu3 alloc] init] autorelease];
TRComputer3* computer3 = [[[TRComputer3 alloc] init] autorelease];
computer3.cpu = cpu;//设置cpu
[computer3 powerOn]; computer.m类实现文件
-(void)powerOn{
NSLog(@"计算机3通电了");
[self.cpu run];
[self start];
}

回到顶部

四、多态

1 多种形态,引用的多种形态。

对于一个引用变量,可以指向任何类的对象。

对于一个父类的引用(类与类之间有一种继承关系),可以指向子类,也可以指向本类,指向的类型不同。

当通过此引用向对象发送消息,调用的方法是不同的,此时方法的调用就是多态。

2 多态类与类之间是继承关系

父类的引用可以指向子类的引用或者本类的引用。

父类的引用指向子类的对象,发送消息,调用的是子类对象的方法。

父类的引用指向本类的对象,发送消息,调用本类的方法。

main.m中
1 //指向本类
TRAnimal* animal = [[[TRAnimal alloc] init] autorelease];
[animal eat];
//指向子类
TRAnimal* animal2 = [[[TRDog alloc] init] autorelease];
[animal2 eat];

3 编译期类型和运行期类型

*在多态下,父类的引用可以指向子类的引用,当编译的时候,编译器无法确定指向的对象是什么类型,所有编译器会将引用当做父类类型引用编译检查。

*在调用方法时,发现确实是子类对象,为子类类型创建空间。

总结:TRAnimal* animal2 = [[[TRDog alloc] init] autorelease];编译时,把TRDog类型当成TRAnimal类型编译。[animal2 eat];运行时,调用的是TRDog类型的对象。

练习:定义一个交通工具类TRTransortation,有一个能力print输出交通工具的具体信息。

交通工具TRTexi的士 TRBus巴士 TRBike自行车

创建五个交通工具,使用多态输出交通工具的信息。

4 多态可以用在参数

练习:创建一个学生对象,gotoSchoolByTrans()

main:创建学生对象,向gotoSchoolByTrans()发送消息,输出,该学生成什么交通工具来上学。

age:10乘坐的士上学

age:12乘坐巴士上学

age:15乘坐自行车上学

 main.m
//多态作为参数(引用)
Student* student = [[[Student alloc] init] autorelease];
Student* texi = [[[Texi alloc] init] autorelease];
Student* bus = [[[Bus alloc] init] autorelease];
Student* bike = [[[Bike alloc] init] autorelease];
[student gotoSchoolByTrans:texi andAge:];
[student gotoSchoolByTrans:bus andAge:];
[student gotoSchoolByTrans:bike andAge:]; student.m实现文件
-(void)gotoSchoolByTrans:(Student *)stu andAge:(int)age{
NSLog(@"age:%d",age);
[stu print];
}

5 多态可以用在返回值类型,返回值多态

练习:写一个方法,帮我们创建对象

传人参数1->的士 2->巴士 3 -> 自行车

 main.m
//多态作为返回值
Student* student2 = [Student studentByNum:2];
[student2 print]; student.m实现文件
+(Student *)studentByNum:(int)num{
switch (num) {
case :
return [[[Texi alloc] init] autorelease];
break;
case :
return [[[Bus alloc] init] autorelease];
break;
case :
return [[[Bike alloc] init] autorelease];
break; default: break;
}
}

6 多态用作数组

 main.m
//多态作为数组
Student* students[];
students[] = [[[Texi alloc] init] autorelease];
students[] = [[[Bus alloc] init] autorelease];
students[] = [[[Bike alloc] init] autorelease];
for (int i = ; i < ; i++) {
[students[i] print];
}

7 多态的好处

可以让我们设计更合理的代码,使代码更通用,使用程序的可维护性和可扩展性更强。

8 多态特性的展现

*可以用在方法的参数

*可以用在方法的返回值类型

*可以用在数组和集合上

重构:写出以下类,用最少的代码解决问题,

TRShape形状类

TRRectangle矩形类x,y

TRCircle圆形r

TRSquare正方形x

求:周长perimeter与面积area,show方法,查看周长和面积。属性、初始化方法、工厂方法、内存管理、继承。(创建三个对象矩形、圆形、正方形、统一遍历)

练习:创建一个Person类,show方法,查看艺术品的详细信息,每个艺术品,都用print查看当前艺术品的详细信息,创建三个艺术品,分别查看艺术品的信息。

Painting(油画):author(作者)、year(年代)、product(艺术品名称)

Music(音乐):

Pop(流行):

product(艺术品名称)、Singer(演唱者)、time(时长)

Rock(摇滚):

SingerCount(演唱者人数)

结构:

     Arts(艺术品)

|-------------------+------------------|

Painting                        Music

        |--------+--------|

Pop            Rock

NSString的使用

NSString* name = @"zhangsan";

stu.name = @"zhangsan";

NSLog(@"%@",stu.name);

@property(copy) NSString* name;

练习:创建一个TREmployee类,TRStaff普通职员,TRManager领导,工资salary、工种job、姓名name,方法输出个人信息print,如果相应的工种领导的工资会比普通职员高2000。TRHR类,人力资源,通过参数来招人,最少代码。(多态、初始化、工厂方法、内存管理)

1软件工程师6000

2测试工程师4500

3高级软件工程师8000

4 软+领 5 测+领 6 高软+领

05-OC多态的更多相关文章

  1. OC 多态

    OC 多态 多态的概念 没有继承,就没有多态 不同类的对象能够定义相同名称的方法 当父类对象的指针或引用指向子类对象时,会进行动态监测,调用真实的方法 C++只有虚函数才能实现多态,OC中所有方法都可 ...

  2. OC——多态

    书接上文,上文提到继承一个很大用途的是为了更好的实现多态,现在我们就来看看OC的多态. 多态:顾名思义就是好多种状态,以前学C#时候印象最深刻的例子是好多个类共同实现同一个接口,然后把这些类的对象都装 ...

  3. OC多态

    要点: 1.多种形态,引用的多种形态对于一个引用变量,可以指向任何类的对象.对于一个父类的引用(类与类之间有一种继承关系),可以指向子类,也可以指向本类,指向的类型不同.当通过此引用向对象发送消息,调 ...

  4. 05 (OC) 二叉树 深度优先遍历和广度优先遍历

    总结深度优先与广度优先的区别   1.区别 1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列. 2) 深度优先遍历:对每一个可能的分支路径深入到不能再深入 ...

  5. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  6. iPhone开发视频教程 Objective-C部分 (51课时)

    第一.二章  OC基础语法 iPhone开发教程 第一章 OC基础语法  iPhone开发概述-必看(1.1)http://www.apkbus.com/android-102215-1-1.html ...

  7. (转载)iPhone开发视频教程 Objective-C部分 (51课时)

      感谢好人的无私贡献!来源:http://www.cnblogs.com/aimeng/p/3370012.html   第一.二章  OC基础语法 iPhone开发教程 第一章 OC基础语法  i ...

  8. iPhone开发视频教程 Objective-C部分

    第一.二章  OC基础语法 iPhone开发教程 第一章 OC基础语法  iPhone开发概述-必看 (1.1) http://www.apkbus.com/android-102215-1-1.ht ...

  9. OC基础--多态 及 三特性小练习

    什么是多态 什么是多态: 多态就是某一类事物的多种形态 猫: 猫-->动物 狗: 狗-->动物 男人 : 男人 -->人 -->动物 女人 : 女人 -->人 --> ...

  10. OC的封装、继承与多态

    面向对象有三大特征:封装.继承和多态. 一.封装 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问.简而言之,信息隐藏,隐 ...

随机推荐

  1. Swift与Objective-C API的交互

    互用性是让 Swift 和 Objective-C 相接合的一种特性,使你能够在一种语言编写的文件中使用另一种语言.当你准备开始把 Swift 融入到你的开发流程中时,你应该懂得如何利用互用性来重新定 ...

  2. if语句判断闰年、平年

     一.让用户输入一个年份,判断是否是闰年. 判断一个年份是否是闰年有两个条件 ①能被400整除:②能被4整除但是不能被100整除 Console.WriteLine("请输入年份:" ...

  3. mbed 初试(LinkNode 板卡)(2016-04-21)

    前言 感谢论坛,感谢 LinkSrite,论坛活动申请了一个 LinkNode,体验了一下 mbed. 翻看完官方 wiki,大概了解了一下 mbed 的开发,然后做了 blink 和 pwm 的测试 ...

  4. Xcode之外的文档浏览工具--Dash (在iOS代码库中浏览本帖)

    链接地址:http://www.cocoachina.com/bbs/read.php?tid=273479 Xcode之外的文档浏览工具--Dash    (在iOS代码库中浏览本帖)       ...

  5. BZOJ 1355: [Baltic2009]Radio Transmission( kmp )

    自己YY一下可以发现answer =  n - fail[ n ] ------------------------------------------------------------------ ...

  6. Mac Yosemite下Android Studio环境问题集合

    1. java not found 在mac Yosemite下,因jre升级到1.8,导致Android Studio无法启动.报错:"JAVA not found". 解决方法 ...

  7. Spring @Resource注解

    @Resource注解   @Resource 注解被用来激活一个命名资源(named resource)的依赖注入,在JavaEE应用程序中,该注解被典型地转换为绑定于JNDI context中的一 ...

  8. JSON 数组格式

    JSON 数据格式 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人 ...

  9. C语言之一数三平方

    一数三平方 有这样一个六位数,它本身是一个整数的平方,其高三位和低三位也分别是一个整数的平方,如225625=475*475,225=15*15,625=25*25;统计所有符合该条件的六位数 源代码 ...

  10. JavaEE Tutorials (6) - 使用嵌入式企业bean容器

    6.1嵌入式企业bean容器概述826.2开发嵌入式企业bean应用82 6.2.1运行嵌入式应用83 6.2.2创建企业bean容器83 6.2.3查找会话bean引用84 6.2.4关闭企业bea ...