一、封装

1.什么是封装

在程序上,隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将对象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

1> set方法

  ① 作用:提供一个方法给外界设置成员变量值,实现对参数的相应过滤

  ② 命名规范

   *方法名必须以set开头

   *set后面跟上成员变量的名称,成员变量名首字母必须大写

   *返回值一定是void

   *一定要接收一个参数,而且参数类型跟成员变量类型一致

   *形参的名称不能跟成员变量名一样

 #import <Foundation.foundation.h>

 @interface Student : NSObject  : NSObject //声明一个类
{
int _age;//设置一个成员变量
} - (void)study;//声明一个study对象方法
- (void)setAge:(int)age;//声明set方法 @end @implementation Student //对声明的方法进行实现 - (void)setAge:(int)age //set方法的实现
{
if(age <= ) //对不合理的值进行过滤
{
age = ;
} _age = age;
} - (void)study //study方法的实现
{
NSLog("%d岁的学生在学习",age);
} @end int main()
{
Student *stu = [Student new];//新建一个Student类型对象
[stu setAge :];//调用set方法进行赋值操作
[stu study];// 对象调用对象方法
return ;
}

set方法例子

2> get方法

  ①作用:返回成员变量值

  ②命名规范

   *有返回值,返回值类型与成员变量类型相同

   *方法名跟成员变量名相同

   *不需要接收任何参数

 #import <Foundation.foundation.h>

 @interface Student : NSObject //声明一个类
{
int _age;//设置一个成员变量
} - (void)study;//声明一个对象方法
- (void)setAge:(int)age;//声明set方法
- (int)age;//声明get方法 @end @implementation Student //对声明的方法进行实现 - (void)setAge:(int)age //set方法的实现
{
if(age <= ) //对不合理的值进行过滤
{
age = ;
} _age = age;
} - (int)age // get方法的实现
{
return _age;
} - (void)study //study方法的实现
{
NSLog("%d岁的学生在学习",[stu age]);//get方法的调用
} @end int main()
{
Student *stu = [Student new];//新建一个Student类型对象
[stu setAge :];//调用set方法进行赋值操作
[stu study];// 对象调用对象方法
return ;
}

get方法例子

3> 封装细节

 ①成员变量名以_开头,命名规范

  *作用1,让成员变量名与get方法名区分开

  *作用2,跟局部变量名分开,带_一般就是成员变量名

 #import <Foundation.Foundation.h>

 @interface Score : NSObject //声明Score类
{
int _cScore;//设置成员变量 _cScore
int _ocScore;//设置成员变量 _ocScore
int _totalScore;//设置成员变量 _totalScore
int _averageScore;//设置成员变量 _averageScore
} - (void)setCScore:(int)cScore;//声明set方法
- (int)cScore;//声明get方法 - (void)setOcScore:(int)ocScore;//声明set方法
- (int)ocScore;//声明get方法 - (int)totalScore;//声明get方法
- (int)averageScore;//声明get方法 @end @implementation Score //方法的实现 - (void)setCScore:(int)cScore //set方法的实现
{
_cScore = cScore;
_totalScore = _cScore + _ocScore;//计算总分,监听成员变量的改变
_averageScore = _totalScore/;//计算平均分
} - (int)cScore // get方法的实现
{
return _cScore;
} - (void)setOcScore:(int)ocScore //set方法的实现
{
_ocScore = ocScore;
_totalScore = _cScore + _ocScore; //计算总分,监听成员变量的改变
_averageScore = _totalScore/;//计算平均分
} - (int)ocScore // get方法的实现
{
return _ocScore;
} - (int)totalScore // get方法的实现
{
return _totalScore;
}
- (int)averageScore // get方法的实现
{
return _averageScore ;
} @end int main()
{
Score *sc = [Score new]; int t = [sc _totalScore];
int a = [sc _averageScore]; NSLog("总分是%d,平均分是%d",t, a); return ;
}

封装练习

4> 封装的好处

  *过滤不合理的值

  *屏蔽内部的赋值过程

  *让外部不必关注内部细节

二、继承

1.继承

通过继承,子类可以拥有父类中所有的成员变量和方法

 #import <Foundation.Foundation.h>

 @interface Animal : NSObject //声明一个Animal类,并且继承了NSObject
{
int _age; // 声明了两个成员变量
double _weight;
}
- (void)setAge:(int)age; //声明set方法
- (void)setWeight:(double)weight;
- int)age; //声明get方法
- (double)weight;
- (void)run; @implementation Animal //类的实现
- (void)setAge:(int)age //set方法的实现
{
_age = age;
} - (void)setWeight:(double)weight//set方法的实现
{
_weight = weight;
} - int)age //get方法的实现
{
return _age;
} - (double)weight //get方法的实现
{
return _weight;
} - (void)run
{
NSLog(@"动物跑了起来");
}
@end @interface Dog : Animal //Dog继承了Animal里面所有的成员变量和方法 @end @implementation Dog @end int main()
{
Dog *d = [Dog new];
[d setAge:];
[d setWeight:20.0];
NSLog(@"%岁的狗,%d公斤",[d age], [d weight]); return ;
}

继承例子

2.重写

子类重新实现父类中某个方法,覆盖父类以前的做法

 #import <Foundation.Foundation.h>

 @interface Animal : NSObject //声明一个Animal类,并且继承了NSObject
{
int _age; // 声明了两个成员变量
double _weight;
}
- (void)setAge:(int)age; //声明set方法
- (void)setWeight:(double)weight;
- int)age; //声明get方法
- (double)weight;
- (void)run; @implementation Animal //类的实现
- (void)setAge:(int)age //set方法的实现
{
_age = age;
} - (void)setWeight:(double)weight//set方法的实现
{
_weight = weight;
} - int)age //get方法的实现
{
return _age;
} - (double)weight //get方法的实现
{
return _weight;
} - (void)run
{
NSLog(@"动物跑了起来");
}
@end @interface Dog : Animal //Dog继承了Animal里面所有的成员变量和方法 - (void)run;
@end @implementation Dog
- (void)run //重写父类run方法
{
NSLog(@"%岁,%d公斤的狗跑了起来",[d age], [d weight]);
} @end int main()
{
Dog *d = [Dog new];
[d setAge:];
[d setWeight:20.0];
[d run];
NSLog(@"%岁的狗,%d公斤",[d age], [d weight]); return ;
}

重写(例子)

3.super作用

1> 直接调用父类中的某个方法

2> super处在对象方法中,就调用父类的对象方法;super处在类方法中,就调用父类的类方法

3> 使用场合:子类重写父类方法时,想保留父类方法的一些行为

4.使用注意

1> 父类必须声明在子类前面

2> 子类不能拥有和父类相同的成员变量

3> 调用某个方法时,优先去当前类中寻找,如果找不到,再去父类中寻找

4> oc语言是单继承

5.缺点

  *耦合性太强,删除父类后,子类就不能够继续使用

6.好处

  * 不改变原来模型的基础上,拓充方法

  * 建立了类与类之间的联系

  * 抽取了公共代码

7.使用场合

1> 当两个类拥有相同的属性和方法时,就可以将相同的东西抽取出到父类中

2> 当A类中拥有B类的部分属性和方法时,可以考虑让B类继承A类

3> 组合:xxx拥有xx; 继承:xxx是xx

三、多态

1.多态:多种形态

1> 没有继承就没有多态

2> 代码体现:父类类型指针指向子类对象

#import <Foundation.Foundation.h>

@interface Animal : NSObject
- (void)eat;
@end @implementation Animal
- (void)eat
{
NSlog(@"动物吃东西");
}
@end @interface Dog : Animal
- (void)eat;
@end @implementation Dog
- (void)eat
{
NSlog(@"Dog吃东西");
}
@end int main()
{
//多种形态
Dog *d = [Dog new];// Dog类型 //多态;父类指针指向子类对象
Animal *a = [Dog new]; [a eat];//调用方法时,检测对象的真实类型 rerurn ;
}

多态(例子)

2.优缺点

1> 好处:如果函数\方法的参数类型使用的父类类型,可以传入子类和父类对象

2> 局限性:父类类型变量不能够直接调用子类特有的方法(编译过程会有警告)。必须强转为子类类型便后后,才能够直接调用子类特有的方法。

四、自我总结

  面向对象的三大特性是面向对象语言的精华所在。面向对象是基于万物皆对象这个哲学观点。把一个对象抽象成类,具体上就是把一个对象的静态特征和动态特征抽象成相应的属性和方法,也就是把一类事物的算法和数据结构封装在一个类之中,程序就是多个对象和互相之间的通信组成的。面向对象具有封装性,继承性,多态性,封装隐蔽了对象内部不需要暴露给外人的细节,使得内部细节的变动跟外界不相关,只单纯依靠提供的接口进行通信。封装性降低了编程的复杂,通过继承,使得新建一个类变得更加容易,一个类从父类那里获得其方法和属性的工作就交给了编译器。而继承、实现和运行时的类型绑定机制所产生的多态,使得不同的类所产生的对象能够对相同的消息作出不同的反应,这极大地提高了代码的通用性。言而总之,面向对象的三大特性大大提高了程序的重用性和可维护性。

oc语言--面向对象的三大特性的更多相关文章

  1. OC面向对象的三大特性

    一.面向对象的三大特性:封装(成员变量).继承和多态 1. set方法和get方法 1. set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员 ...

  2. 面试问题之C++语言:面向对象的三大特性

    转载于:https://www.cnblogs.com/BEN-LK/p/10720249.html 面向对象的三大特性:封装.继承.多态 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和 ...

  3. 谈谈Java面向对象的三大特性

    Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...

  4. JavaScript面向对象的三大特性

    1.JavaScript面向对象的三大特性 JavaScript的三大特性:封装性.继承性.多态性. 2.JavaScript实现封装特性 在一些静态类型的语言如java中,本身语法就提供了这些功能. ...

  5. python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试

    一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...

  6. Java基础-面向对象第三大特性之多态(polymorphism )

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  7. 面向对象:三大特性、类成员、property

    一.类的基础知识 python 一切皆为对象. 我们以前的str,list,int 都是对象. 1.1 类的定义 与 调用 class 关键字用来定义类,注意类名首字母大写. 类的调用,先实例化一个类 ...

  8. 菜鸟笔记 -- Chapter 6.4 面向对象的三大特性

    6.4.1  三大特性概述 面向对象的三大特性是Java中一个很重要的基本理念. 封装是面向对象的核心思想.将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的意思.采用 ...

  9. JavaScript中面向对象的三大特性(一个菜鸟的不正经日常)

    经过几天的学习,把jQuery给啃会了,但是运用的还不算特别熟练,总感觉自己在JavaScript方面的基础十分欠缺,所以继续拾起JavaScript,开始更好的编程之旅~ 今天学的是JavaScri ...

随机推荐

  1. Realm

    还在为数据库不能获取最新数据而犯愁?信我,你只是需要一个活着的数据库——Realm 写在前面: 又到一年一度七夕虐狗节,看着大家忍受着各种朋友圈和QQ空间还有现实生活中的轮番轰炸,我实在不忍心再在这里 ...

  2. 设置Ubuntu Mysql可以远程链接

    1:修改my.cnf配置文件 $sudo vim /etc/mysql/my.cnf 修改为: bind-address = 0.0.0.0 2:进行授权操作 mysql> grant all ...

  3. android获取sdk更新

    http://www.th7.cn/Program/Android/201310/154981.shtml 网上许多解决 Android SDK Manager 无法更新(下载)的问题的方法基本都是将 ...

  4. DataGrid导出excel

    DAL://产品信息导出——LPH public DataTable ExportRelease(string type) { string sql = "SELECT [ProductID ...

  5. SATA1.0,2.0,3.0区别

    外观没区别,接口都一样,线也一样,就是传输速率不一样,控制芯片不一样SATA1.0理论传输速度为1.5Gbit/s SATA2.0理论传输速度为3Gbit/sSATA2.0理论传输速度为6Gbit/s ...

  6. UESTC_Just a Maze CDOJ 1162

    Just a Maze Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 262144/262144KB (Java/Others) Su ...

  7. 《Two Days DIV + CSS》读书笔记——CSS控制页面方式

    1.1 你必须知道的知识 (其中包括1.1.1 DIV + CSS的叫法解释:1.1.2 DIV + CSS 名字的误区:以及1.1.3 W3C简介.由于只是背景知识,跳过该章.) 1.2 你必须掌握 ...

  8. poj2787 算24

    每次枚举两个数,一个运算符,得到一个运算结果.在重复执行,直到只剩下一个数即可. #include <iostream> #include <cmath> using name ...

  9. hdu 5430 Reflect (数学推导题)

    Problem Description We send a light from one point on a mirror material circle,it reflects N times a ...

  10. python list 中找连续的数字(由网友处学习)

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #学习这个要求的:http://wsky.org/archives/ ...