objective-c自学总结(三)---面向对象的封装,继承与多态
面向对象的三大特性
- 封装
- 继承
- 多态
1.封装:
- 隐藏属性,方法或实现细节的过程称为封装
- 信息隐藏,隐藏对象的实现细节,不允许用户看到 将东西包装在一
- 然后以新的完整形式呈现出来 例如,两种或多种化学药品组成一个胶囊
- 将方法和属性一起包装到一个单元中,单元以类的形式实现 对象同时具有属性和方法两项特性
- 对象的属性和方法通常被封装在一起,共同体现事物的特性,二者相辅相成,不能分割
2继承:
2.1继承的定义:
- A是B
- 如果这句话能说得通,在设计程序的时候就可以看成是继承关系
子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性
为什么要用继承:观察下面两段代码
//卡车类
@interface Truck : NSObject
{
// 品牌
NSString *_brand;
//颜色
NSString *_color;
float _maxWeight;
}
-(id)initWithlamp:(float)wattage;
//启动
-(void)star;
//刹车
-(void)stop;
@end
//出租车类
@interface Taxi : NSObject
{
// 品牌
NSString *_brand;
//颜色
NSString *_color;
float _company;
}
-(id)initWithengine:(NSString*)model Withcapacity:(NSInteger)capacity;
//启动
-(void)star;
//刹车
-(void)stop;
@end
代码存在很明显的重复现象
如何改进?有没有可能建立继承关系让子类自动继承父类的属性和方法?
- 定义一个通用的类,他有基本的实例变量。子类只要继承了该类,就可以拥有这些实例变量。子类也可以定义自己的实例变量。
- 被继承的类叫超类或父类,继承父类的类叫子类或派生类。
OC中继承的语法规则为:
@interface 子类 : 父类子类自动继承父类的属性和方法
改进如下
//车类
@interface Car : NSObject
{
// 品牌
NSString *_brand;
//颜色
NSString *_color;
}
//启动
-(void)star;
//刹车
-(void)stop;
@end
//卡车类
@interface Truck : NSObject
{
float _maxWeight;
}
-(id)initWithlamp:(float)wattage;
@end
//出租车类
@interface Taxi : NSObject
{
float _company;
}
-(id)initWithengine:(NSString*)model Withcapacity:(NSInteger)capacity;
@end
这样就很好的避免了代码的重复编写。
2.2:再谈self/super
2.2.1:再谈self
- 使用self优先调用当前类的方法
- 当前类如果没有则调用父类。
2.2.1:再谈super
- super关键字可以调用从父类继承下来的方法
@implementation Worker
-(id)init{
self=[super init];
if(self)
{
}
return self;
}
2.3:方法重写
- 通过方法的重写,子类可以改变从父类继承的行为
- 被重写的方法定义必须与父类中的方法完全一样。
//父类的方法
-(void)work
{
NSLog(@"人开始干活");
}
//子类重写的方法
-(void)work
{
NSLog(@"学生开始学习");
}
3.多态:
下面来看一组代码
//父类
@implementation Paint
-(void)paintf
{
NSLog(@"打印机打印");
}
@end
//子类(重写)
@implementation blackPrint
-(void)paintf
{
NSLog(@"黑白");
}
@end
//子类(重写)
@implementation colorPaint
-(void)paintf
{
NSLog(@"彩色");
}
@end
#import "Person.h"
@implementation Person
//使用彩色打印机
-(void)paintWithColor:(colorPaint*)paint
{
[paint paintf];
}
//使用黑白打印机
-(void)paintWithBlack:(blackPrint*)paint
{
[paint paintf];
}
@end
可以看出来每次增加一个打印机,都要在Person类中增加相应的打印方法,代码的课扩展性和可维护性极差。
这样我们就可以利用多态来解决。
多态是指同一种类型具有多种表现形态。
也就是说不同的子类继承同一个父类这些子类可以看做是同一类型,子类覆盖父类的方法,每个子类实现的功能不相同,这就是多态。
多态的条件
- 必须存在继承关系
- 子类重写父类的方法
- 父类声明的变量指向子类对象
paint*color=[[colorPaint alloc] init];
paint*black=[[blackPrint alloc] init];
解决方法
@implementation Persion
-(void)doPaint:(Paint*)paint
{
[paint paintf];
}
使用多态后,当需要增加新的子类类型时,无需更改Person类,程序的可扩展性和可维护性增强。
objective-c自学总结(三)---面向对象的封装,继承与多态的更多相关文章
- python 面向对象及封装继承和多态
######装饰器######装饰器的概念 - 装饰器的实现是函数里面嵌套函数;- 装饰器的本质是一个函数, 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能;- 装饰器需要传递一个函数, ...
- Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。
Python3 与 C# 面向对象之-继承与多态 文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...
- Python面向对象中的继承、多态和封装
Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...
- day33 序列类型,绑定方法,类方法,静态方法,封装继承和多态
Python之路,Day20 = 序列类型,绑定方法,类方法,静态方法,封装继承和多态 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要 ...
- C#基础总结之八面向对象知识点总结-继承与多态-接口
.方法深入讲解(返回值,形参与实参) 方法 public int getName(int i,int j) { int sum = i + j; return sum; } .利用泛型存储对象数据 . ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- C# 面向对象基础&封装&继承&多态&加深一下冒泡排序写法
(一)面向对象是什么? 面向对象是一种编程思想 (二)为什么要用面向对象? 1.结构清晰 2.易于维护 3.方便扩展 (三)new一个对象是什么过程? 实例化构造函数创建对象的过程就是将类实例化的过程 ...
- C++之封装继承和多态
C++中非常重要的概念,尤其是相对于C语言而言,也是其具有如此高的工程使用性的重要原因. 封装 所谓封装是将某些东西隐藏起来,让外界无法直接使用,而必须通过某些特定的方式才能访问.也即是,将抽象得到的 ...
- 04_Java面向对象特征之继承与多态
1. 继承 Java继承的实现(只支持单继承,而不是多继承,但有接口的多实现) 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类. 定义类时直接通过extends关键字指明要继承的父类.子类对 ...
随机推荐
- hdu1505
the main algorithm as the 1506 #include <stdio.h> #include <iostream> #include <strin ...
- Jquery入门之---------基本事件------------
Javascript有一个非常重要的功能,就是事件驱动. 当页面完成加载后,用户通过鼠标或键盘触发页面中绑定事件的元素即可触发.Jquery为开发者更有效率的编写事件行为,封装了大量有益的事件方法供我 ...
- subpage和secondary page的区别
Hi, Can you tell me the differences between subpage and secondary page and when to use which ? I n ...
- jquery二级目录选中当前页的样式
<div class="navlist clear"> <span><a href="/M/Page_32.html" title ...
- Sql Server 常用的查询
基本常用查询 --select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 selec ...
- PHP导出excel文件
现在教教你如何导入excel文件: 在我的文件储存里面有一个com文件夹的,将其解压放在ThinkPHP/Library/文件夹里面,然后就是写控制器啦!去调用这个插件: <?php names ...
- Windows下安装redis,并与PHP使用
一.在windows下安装redis: redis的官方网站下载地址:http://redis.io/download 进入以上网址之后,请见以下的图片操作下载redis: 第一步: 第二步:在对应的 ...
- 解决Genymotion下载设备失败的方法(Connection Timeout)
一直下载不下来,报错. 解决办法: 打开 C:\Users\用户名\AppData\Local\Genymobile目录 打开genymotion.log文件,在里面最下面几行,找到如下日志 [Deb ...
- 最大子列和CT 01-复杂度2 Maximum Subsequence Sum
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
- linux 使用 pyodbc 访问 ms sqlserver 数据库
一.安装linux下Sqlserver的驱动程序: 我们先来安装SqlServer的驱动程序,再安装ODBC相关的,目的是想尽快可以进行测试,因为在安装完Freetds之后,我们马上就可以在linux ...