博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
objective-c自学总结(三)---面向对象的封装,继承与多态
阅读量:4980 次
发布时间:2019-06-12

本文共 2426 字,大约阅读时间需要 8 分钟。

面向对象的三大特性

  • 封装
  • 继承
  • 多态

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类,程序的可扩展性和可维护性增强。

转载于:https://www.cnblogs.com/leishitou/p/5436202.html

你可能感兴趣的文章
[django]form的content-type(mime)
查看>>
仿面包旅行个人中心下拉顶部背景放大高斯模糊效果
查看>>
C# 小叙 Encoding (二)
查看>>
CSS自学笔记(14):CSS3动画效果
查看>>
项目应用1
查看>>
基本SCTP套接字编程常用函数
查看>>
C 编译程序步骤
查看>>
[Git] 005 初识 Git 与 GitHub 之分支
查看>>
【自定义异常】
查看>>
pip install 后 importError no module named "*"
查看>>
springmvc跳转方式
查看>>
IOS 第三方管理库管理 CocoaPods
查看>>
背景色渐变(兼容各浏览器)
查看>>
iOS 电话在后台运行时,我的启动图片被压缩
查看>>
运用PCA进行降维的好处
查看>>
matlab
查看>>
《构建之法》阅读笔记02
查看>>
如何利用python将.doc文件转换为.docx文件
查看>>
Ubuntu 14.04 定时任务
查看>>
切片对象
查看>>