黑马程序员_OC学习之封装,继承,多态
来源:互联网 发布:windows route trace 编辑:程序博客网 时间:2024/05/04 10:38
------- IOS培训、android培训、期待与您交流! ----------
面向对的三大特征就是,我们经常提到的 封装、继承、多态。
1.封装:
隐藏属性、方法或实现细节的过程,不去关心你的方法是怎么实现的,只关心你能做什么。并且,封装的意义在于
保护或者防止代码(数据)被我们无意中破坏。
通常情况下我们可能会定义一个类,比如student ,这是一个学生类
他会有一些成员变量,例如:
int age; / / 学生姓名
int number //学生编号
那么也许我们在之后,创建了一个student对象,
student *s=[student new]
我们就就可以给这个s对象的age赋值操作,在实际情况下,我们也学会设置
s.age=10;
s.age=20;
但是如果程序或者人为,将
s.age=-20;
上面这就感觉很奇怪了,在现实中这显然是没有意思的,也是违背实际情况的。那么这是我们就需要用到封装了。
将 age 设为一个 @private,这样,这个成员变量就不能在累的外部访问了。
想要更改age的值,我们就提供一个
set方法------》
如果向下面这样写:
// set方法的实现
- (viod)setAge : (int)newAge
{ //对传进来的参数进行过滤
if(newAge <= 0)
{
newAge = 1;
}
age = newAge;
}
这样经过setAge方法判断过滤,就可以实现正确安全的操作了,这就是一个简单的封装案例。
2.继承
基于一个已存在的类构造一个新类。继承已存在的类就是复用这些类的方法和属性,在此基础上,还可以在新类中添加一些新的方法和属性.
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。
OC中集成的句法就是 :
例如:
@interface person : NSObject
{
NSString *name;
int age;
}
@end
注:NSObject是所有类的基类
我们还可以定义一个student 来继承person,如下
@interface student : person
{
int number; //学号
}
@end
经过上面的定义,虽然student类中没有name 以及 age的定义,但是但你创建一个student对象时,它是具有age以及name这两个属性的。
从上面就知道:
继承的好处
1. 重复的代码可以只写一边。
2. 子类可以拥有父类中所有的成员变量和方法。
3.多态
多态性(polymorphism)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的实例给父类类型的指针。
假如我们有一个Animal类,而现在又有两个类Dog和Cat都继承了Animal。
我们知道Dog以及Cat两个类,都有实现“叫”的这个功能,但是两种类的对象的叫的具体方法肯定是不一样的。那个这是,我们想写一个方法,实现当我们传一个Dog的对象,就执行Dog类定义的方法。传一个Cat的对象,也执行自己的方法。那么怎么办:
这里就用到了多态:例如
Animal *a = [Dog new]; //这是一个Dog对象
Animal *b = [Cat new]; //这是一个Cat对象
这就是允许将子类类型的实例给父类类型的指针。
然后我们分别调用
[a Say];//这是会执行Dog类定义的具体方法
[b Say];//这是会执行Cat类定义的具体方法
多态的实现可以采用以下几种方式:
(1)使用 vod * (万能指针)来实现“编译时多态”。
(2)使用函数指针来实现“运行时多态”。
(3)使用型如
struct struct_name{
char temp[0]; //或者char *temp;
};
这种形式。
举例:
void HandleMsg(unsinged int id, void *p)
{
Msg1 *p1;
Msg2 *p2;
switch(id)
{
case key1:
p1 = (Msg1*)p;
//do something
break;
case key2:
p2 = (Msg2*)p;
//do something
break;
default:
break;
}
}
------- IOS培训、android培训、期待与您交流! ----------
- 黑马程序员_OC学习之封装,继承,多态
- 黑马程序员_OC学习之封装、继承、多态、组合
- 黑马程序员学习笔记_OC之继承
- 黑马程序员_OC继承封装多态
- 黑马程序员_OC语言之面向对象的三大特性(封装、继承、多态)
- 黑马程序员_OC封装
- 黑马程序员_OC学习之点语法
- 黑马程序员_OC学习之block,protocol
- 黑马程序员学习笔记_OC之self
- 黑马程序员学习笔记_OC之NSString
- 黑马基程序员学习笔记_OC之三大特性之封装
- 黑马程序员_OC面向对象之继承和多态
- 黑马程序员_OC关键字学习
- 黑马程序员_OC继承与组合
- 黑马程序员-[OC]学习之旅-封装、继承
- 黑马程序员_OC学习之面向对象理解
- 黑马程序员_OC学习之Foundation框架1
- 黑马程序员_OC学习之Foundation框架2
- 重要经验四:实时检测UITextField之的变化
- C#网络编程(同步传输字符串) - Part.2
- 适合一岁宝宝的5种体育游戏
- 地宫取宝
- phpcms 被注码一般放在什么文件里
- 黑马程序员_OC学习之封装,继承,多态
- Android -- 杀死进程, 在一个APP安装另一个APP,反编译APP
- 性能调优
- C#网络编程(异步传输字符串) - Part.3
- 处理爱拍万平口
- 小儿按摩退热四注意
- Android导入项目出现Fix Project Properties.时修复
- 散养土鸡和饲料鸡的主要差别
- 大型网站架构演变过程、大并发服务器架构