面向对象的三大特性

  • 封装
  • 继承
  • 多态

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自学总结(三)---面向对象的封装,继承与多态的更多相关文章

  1. python 面向对象及封装继承和多态

    ######装饰器######装饰器的概念 - 装饰器的实现是函数里面嵌套函数;- 装饰器的本质是一个函数, 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能;- 装饰器需要传递一个函数, ...

  2. 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.单继 ...

  3. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

  4. day33 序列类型,绑定方法,类方法,静态方法,封装继承和多态

    Python之路,Day20 = 序列类型,绑定方法,类方法,静态方法,封装继承和多态 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要 ...

  5. C#基础总结之八面向对象知识点总结-继承与多态-接口

    .方法深入讲解(返回值,形参与实参) 方法 public int getName(int i,int j) { int sum = i + j; return sum; } .利用泛型存储对象数据 . ...

  6. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  7. C# 面向对象基础&封装&继承&多态&加深一下冒泡排序写法

    (一)面向对象是什么? 面向对象是一种编程思想 (二)为什么要用面向对象? 1.结构清晰 2.易于维护 3.方便扩展 (三)new一个对象是什么过程? 实例化构造函数创建对象的过程就是将类实例化的过程 ...

  8. C++之封装继承和多态

    C++中非常重要的概念,尤其是相对于C语言而言,也是其具有如此高的工程使用性的重要原因. 封装 所谓封装是将某些东西隐藏起来,让外界无法直接使用,而必须通过某些特定的方式才能访问.也即是,将抽象得到的 ...

  9. 04_Java面向对象特征之继承与多态

    1. 继承 Java继承的实现(只支持单继承,而不是多继承,但有接口的多实现) 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类. 定义类时直接通过extends关键字指明要继承的父类.子类对 ...

随机推荐

  1. 深入理解ASP.NET的内部运行机制(转)

    WebForms和WebServices作为.NET平台构建Web程序的两大利器,以其开发简单.易于部署的特点得到了广泛的应用,但殊不知微软公司在背后为我们做了大量的基础性工作,以至于我们开发人员只需 ...

  2. 001Linux命令

    1.删除非空目录的命令:rm -rf [目录名],r表示迭代,f表示强制: 删除空目录:rmdir [目录名]: 删除文件:rm [文件名]: 2.用户管里类命令: (1)添加用户:useradd [ ...

  3. Android IOS WebRTC 音视频开发总结(三四)-- windows.20150706

    最近好不容易更新了PC版的WEBRTC,总结下有哪些调整,文章来自博客园RTC.Blacker,支持原创,转载请说明出处. 图1:解决方案工程结构对比: 说明: 1, 最大的调整就是移除了VideoE ...

  4. gdb调试工具使用方法分享

    刚才看了一个CSDN上分享gdb调试工具使用的教程,讲得非常好,推荐到这里: http://blog.csdn.net/liigo/article/details/582231

  5. 比较合并工具vimdiff的主要用法归纳

    参考:https://www.ibm.com/developerworks/cn/linux/l-vimdiff/ vimdiff主要用法归纳如下:   1.打开文件 vimdiff file1 fi ...

  6. phpMyAdmin提示“Access denied for user 'root'@'localhost' (using password: NO)”的解决办法

    一.错误内容 在用thinkPHP登陆phpMyAdmin时遇到以下错误 #1045 - Access denied for user 'root'@'localhost' (using passwo ...

  7. tp框架集成支付宝,中转页变成gbk编码

    tp框架中集成支付宝的功能,将支付宝的demo例子存在到下图位置\Extend\Vendor\Alipay 生成支付订单 /** * 支付订单 */ public function pay() { h ...

  8. 管理员 修改MySQL 5.7.9 新版本的root密码方法以及一些新变化整理

    MySQL 5.7版本开始,增强密码验证机制,网上说安装的时候会在/root/.mysql_secret  文件中生成默认密码,这一点自 5.7.6版本以后也去掉了. 针对如果生成默认密码,网上有一个 ...

  9. 在 Windows 7 環境安裝 Python 2.6.6

    目前 Python 的最穩定的版本是 2.7.3 及 3.2.3,因為 2.x 與 3.x 語法並不是完全相容,在各版本之間也有些差異,所以建議還是各自安裝需要的版本… 艾小克工作環境是使用 2.6 ...

  10. sliding windows (poj 2823) 题解

    [问题描述] 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表: [样例输入] 8 3 1 3 -1 -3 5 3 6 7 [样例输 ...