OC中的类的三大特性类: 继承,封装,多态

一、 封装

封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,这样我们在定义类的时候,哪些字段和方法不想暴露出去,哪些字段和方法可以暴露,可以通过修饰符来完成,这就是封装,下面来看一个例子吧:

#import <Foundation/Foundation.h>  

@interface Car : NSObject{
//这个属性就是对外进行保密的相当于private,所以我们需要在外部访问的话,必须定义get/set方法
//默认的是protect的,但是我们可以使用@public设置为public属性的,那么在外部可以直接访问:person->capcity = 2.8;
//当然我们一般不这么使用,因为这会破坏封装性,这种用法相当于C中的结构体中权限 也就是一般不能把实例变量设置public属性
//一共四种:@public,@protected,@private,@package,这个和Java中是相同的
@public
float _capcity; //油量属性
} - (void)run:(float)t; @end

这里我们可以看到,OC中也是有四种访问权限修饰符:

@public、@protected、@private、@package

其中默认的修饰符是@protected

但是这里要注意的是:OC中的方法是没有修饰符的概念的,这个和Java有很大的区别,一般都是公开访问的,即public的,但是我们怎么做到让OC中的一个方法不能被外界访问呢?

OC中是这么做的,如果想让一个方法不被外界访问的话,只需要在.m文件中实现这个方法,不要在头文件中进行定义,说白了就是:该方法有实现,没定义,这样外界在导入头文件的时候,是没有这个方法的,但是这个方法我们可以在自己的.m文件中进行使用。

为什么要介绍这点知识呢?因为在后面我们会说到单利模式,到时候就会用到这个知识点了。

二、继承

继承是类中的一个重要的特性,他的出现使得我们没必要别写重复的代码,可重用性很高。当然OC中的继承和Java中是一样的,没多大区别,这里在看一个例子吧:

首先来看一下父类:Car

#import <Foundation/Foundation.h>  

  //定义两个属性和一些方法
@interface Car : NSObject{
NSString *_brand;
NSString *_color;
} - (void)setBrand:(NSString *)brand; //父类的set方法
- (void)setColor:(NSString *)color;
- (void)brake;
- (void)quicken; @end @implementation Car //类的实现
- (void)setBrand:(NSString *)brand{
_brand = brand;
}
- (void)setColor:(NSString *)color{
_color = color;
}
- (void)brake{
NSLog(@"刹车");
}
- (void)quicken{
NSLog(@"加速");
}
@end // 定义一个子类 Taxi 继承的是父类Car
@interface Taxi : Car{
NSString *_company;//所属公司 新增一个属性 _company
} //打印发票
- (void)printTick; //新增一个方法 printTick @end #import "Taxi.h" @implementation Taxi - (void)printTick{
[super brake]; // super 关键字调用父类break方法
[self brake]; // self break 同样是调用父类方法
NSLog(@"%@出租车打印了发票,公司为:%@,颜色为:%@",_brand,_company,_color);
} @end /*
这里可以使用super关键字来调用父类的方法,同时这里我们也是可以用self关键字来调用,这里看到其实这两种方式调用的效果是一样的,
当我们在子类重新实现brake方法的时候,那么这时候super关键字调用的还是父类的方法,而self调用的就是重写之后的brake方法了。
同样,我们也是可以使用父类中的属性。 */ @interface Truck : Car{
float _maxWeight;//最大载货量
} //这里就自己定义了一个brake方法,这时候就会覆盖父类中的brake方法了。覆盖父类的方法brake
//优先调用子类的方法
- (void)brake; - (void)unload; @end #import "Truck.h" @implementation Truck - (void)brake{
[super brake];
NSLog(@"Truck类中的brake方法");
} - (void)unload{
[super brake];//调用父类的方法
[self brake];//也是可以的 这里就可以看到,我们会在brake方法中调用一下父类的brake方法,然后在实现我们自己的逻辑代码。
NSLog(@"%@的卡车卸货了,载货量:%.2f,汽车的颜色:%@",_brand,_maxWeight,_color);
} @end

三、多态

多 态对于面向对象思想来说,个人感觉是真的很重要,他对以后的编写代码的优雅方式也是起到很重要的作用,其实现在很多设计模式中大部分都是用到了多态的特 性,Java中的多态特性用起来很是方便的,但是C++中就很难用了,其实多态说白了就是:定义类型和实际类型,一般是基于接口的形式实现的.

书面意思就是: 来自不同类的对象可以定义共享相同名称的方法

多态:相同的名称 不同的类  (多种形态)

#import <Foundation/Foundation.h>

@interface Animal :NSObject  //定义一个Animal类
- (void)eat; @end @implementation Animal // 实现Animal类 -(void)eat
{
NSLog(@"Animal 吃东西----");
}
@end @interface Dog:Animal //定义一个Dog 类 继承Animal
- (void)eat; @end @implementation Dog // 实现Dog 类
- (void)eat
{
NSLog(@"Dog 吃东西----"); }
@end int main()
{
//多种形态
Dog *a = [Dog new]; //dog 类型
[a eat]; // 调用的是Dog类方法 //多态:父类指针指向子类对象
Animal *a1 = [Dog new]; // 这里可以发现将Dog 对象给到了Animal类而没有给到Dog 类
[a1 eat]; return 0; }
/*
类的多态:
1>必须有继承才可以使用多态 */ #import <Foundation/Foundation.h> @interface Animal :NSObject //定义一个Animal类
- (void)eat;
@end @implementation Animal // 实现Animal类
-(void)eat
{
NSLog(@"Animal 吃东西----");
}
@end @interface Dog:Animal //定义一个Dog 类 继承Animal
- (void)eat;
@end @implementation Dog // 实现Dog 类
- (void)eat
{
NSLog(@"Dog 吃东西----");
}
@end @interface Cat :Animal //定义Cat 类
-(void)eat @end @implementation Cat//实现cat 类
-(void)eat
{
NSLog(@"Cat 吃东西----");
} @end -(void)eat(Animal *a)
{ [a eat]; }
int main()
{ //Cat *c =[Dog new]; //这个在编译器中是不报错的只会提醒,因为把Dog 划到Cat类不符合逻辑 因为OC是弱语法
//Cat *c = [Animal new]; // Animal 不是Cat 所以也会出现警告 //正常的写法就可以这样写: /*
Animal *c = [Cat new];
NSObject *C = [Cat new];
NSObject *D = [Dog new];
*/ //多态的好处 避免重复代码来实现喂猫 喂狗 讲子类对象直接传递到父类指针即可
Animal *a [Animal new];
feed (a); Dog *d = [Dog new];
feed (d); Cat *c = [Cat new];
feed(c); //多种形态
Dog *a = [Dog new]; //dog 类型
[a eat]; // 调用的是Dog类方法 //多态:父类指针指向子类对象
Animal *a1 = [Dog new]; // 这里可以发现将Dog 对象给到了Animal类而没有给到Dog 类 //调用方法是会检测对象的真实形象
[a1 eat]; // 输出的是dog方法 return 0; }

6--OC--封装 继承 多态的更多相关文章

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

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

  2. 浅谈学习C++时用到的【封装继承多态】三个概念

    封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

  3. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  4. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  5. Java基础——面向对象(封装——继承——多态 )

    对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...

  6. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  7. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  8. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  9. C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  10. java四大特性理解(封装继承多态抽象)

    封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

随机推荐

  1. Gentoo本地化设置--Locale系统介绍

    locale是什么? 一份Locale是一组信息的集合,大多数程序利用它来确定特定的国家和语言设置.这些locale以及它们包含的数据是系统库的一部分,可以在大多数系统中的/usr/share/loc ...

  2. chapter8_1 编译执行和错误

    1.编译 前面介绍的,dofile是一个运行lua代码块的基本操作,实际上它是一个辅助函数. loadfile才真正做了核心的工作.dofile(打开文件,执行里面的代码块)和loadfile(从文件 ...

  3. 关于oracle数据库(6)约束

    约束类型 1.主键primary key(一般是一个表的标志,所以一个表只能有一个主键:主键不能为空,不能重复) 2.唯一键unique(不能重复) 3.外键foreign key 4.检查约束che ...

  4. 对端口Com1的访问被拒绝

    某项目中,需通过com口的方式读取CF卡的rfid,. 问题:当我关闭模块,然后第二次打该模块时,弹出如下错误”对端口Com1的访问被拒绝”(编程这一行业,不是找不到对象,就是被xxx拒绝!): 断点 ...

  5. linux时间同步,ntpd、ntpdate

    linux时间同步,ntpd.ntpdate 在Windwos中,系统时间的设置很简单,界面操作,通俗易懂.而且设置后,重启,关机都没关系.系统时间会自动保存在Bios的时钟里面,启动计算机的时候,系 ...

  6. Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型

    http://blog.csdn.net/a352193394/article/details/39503857  Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会 ...

  7. 股票K线图-JfreeChart版

    http://blog.csdn.net/ami121/article/details/3953272 股票K线图-JfreeChart版 标签: jfreechartpropertiesapplet ...

  8. 认识ASP.NET MVC的5种AuthorizationFilter

    在总体介绍了筛选器及其提供机制(<深入探讨ASP.NET MVC的筛选器>)之后,我们按照执行的先后顺序对四种不同的筛选器进行单独介绍,首先来介绍最先执行的AuthorizationFil ...

  9. 安装 nodejs

    接下来使用npm命令安装express和socket.io 没有的话 用yum 安装一下 12 npm install --save expressnpm install --save socket. ...

  10. knockout.js

    最近在使用knockout这个JS的MVVM模型,真的很不错,每次去查英文的文档,的确很累的,抽空的时候就把看到的文档按自己的理解翻译一下.当然我不是逐字的翻译. knockout的官方说明:http ...