面向对象的三大特性

  • 封装
  • 继承
  • 多态

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. C# 多线程传参

    using System; using System.Threading; //多线程调试: 2013.10.08 namespace ThreadExample { class App { publ ...

  2. zip的打包与解包和包下载

    text文件压缩包解析与下载 //压缩包下载  private StreamedContent newsTemplate; //该方法是对压缩包进行下载     public StreamedCont ...

  3. Incorrect integer value: '' for column 'id' at row 1

    最近在写个查询 插入语句的时候 我是这么写的 insert into test values('',$row[contentid],'".$tn."'); 结果搞死没插入进去  然 ...

  4. ViewPage显示Fragment集合实现左右滑动并且出现tab栏--第三方开源--SlidingTabLayout和SlidingTabStrip实现

    注意:有关Fragment的方法和ViewPager的全部是android.support.v4包的,否则会报很多的错误 MainActivity: package com.zzw.fragmentt ...

  5. 通过HttpClient方式连接网络

    xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...

  6. js控制div动起来

    代码: <html> <head> <title>让div动的测试</title> <script language="javascri ...

  7. 生日蛋糕 (codevs 1710) 题解

    [问题描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri,高度为Hi的圆柱 ...

  8. 小木棍 (codevs 3498)题解

    [问题描述] 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过100. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长 ...

  9. .Net并行编程

    1.什么是线程?线程和进程的区别是什么? 线程是程序执行的最小单元. 区别: 进程是操作系统进行资源处理和分配的最小单位,而一个进程可以包含多个线程,并共享进程的资源. 2.什么是多线程?为什么设计多 ...

  10. jquery的prop()和attr()

    jQuery1.6以后prop()和attr()的应用场景如下: 第一原则:只添加属性名称该属性就会立即生效应该使用prop(); 第二原则:只存在true/false的属性应该使用prop(); 设 ...