面向对象的三大特性

  • 封装
  • 继承
  • 多态

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. .net读取ini配置文件的操作

    #region 读取和写入ini文件的操作   string inipath = System.Windows.Forms.Application.StartupPath + @"\conf ...

  2. PHP实现物流查询(通过快递网API实现)

    物流查询实现 引 言:目前快递公司太多了,不可能一个一个去申请api查询.这个时候,就可以通过合作,找一些中间商合作.我试了两家,一家是快递100,一家是快递网. 他们都需要申请key.但是快递100 ...

  3. Linux设备模型 学习总结

    看LDD3中设备模型一章,觉得思维有些混乱.这里从整体的角度来理理思路.本文从四个方面来总结一些内容: 1.底层数据结构:kobject,kset.2.linux设备模型层次关系:bus_type,d ...

  4. C# Java 3DES加密解密 扩展及修正\0 问题

    注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ------------------------------------- ...

  5. Valid Parentheses [LeetCode 20]

    1- 问题描述 Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if ...

  6. 实现弹出收回菜单效果ios源码

    REMenu能够提供下弹出来的菜单,跳转到不同的vc后菜单便会收起.菜单的弹收都有回弹(bounce)的效果.效果图: <ignore_js_op> 使用方法: 先把REMenu的文件夹复 ...

  7. Android开发教程 录音和播放

    首先要了解andriod开发中andriod多媒体框架包含了什么,它包含了获取和编码多种音频格式的支持,因此你几耍轻松把音频合并到你的应用中,若设备支持,使用MediaRecorder APIs便可以 ...

  8. linux device model简述

    参考: 1)<LINUX设备驱动程序>第十四章 Linux 设备模型 2)内核源码2.6.38 内核初始化的时候会对设备模型作初始化,见init/main.c: start_kernel- ...

  9. 解决Linux中遇到No such device

    虚拟机备份转移后,网络启动异常,提示“SIOCSIFADDR: No such device” he problem lies in the fact that ethernet MAC addres ...

  10. Oracle中rownum的用法

    rownum是Oracle对查询结果进行顺序编号,第一行分配1,第二行2,以此类推.rownum不能以任何表的名称作为前缀. rownum这个伪字段可以用于控制返回的记录行数. 例如表:student ...