——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
封装、继承和多态是面向对象程序设计中类的三大特性。是我们学习类、学习OC时必须去掌握的问题。我们今天就来学习学习封装、继承和多态的基础知识点。
第一章 封装
首先可以思考两个问题:1)封装是什么? 2)封装的目的?
答案:
1)封装即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
2)封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
封装的最基本原理就是类中的实例变量只能被当前的对象进行访问。
封装的原则:
1)把尽可能多的东*起来.对外提供简捷的接口。
2)把所有的属性藏起来。
与封装相关的几个关键字@public,@private,@pretect
#import <Foundation/Foundation.h>
@interface Caculator : NSObject
{
//@public任何地方的对象都能够访问
@public;
int _num1;
//@protect实例变量是受保护的,当前对象和子类的对象可以访问
@protect
int _num2;
//@private实例变量是私有的,只能自己被访问
@pravite
float _result;
}
@end
@public、@protect和@private的作用域为代码出现到遇到’}’时结束,或者遇到下一个管理访问级别的关键字时结束。当OC没有对实例变量作任何说明时,OC中默认的安全级别是@protect。
第二章 继承
继承是程序一个很方便也是很重要的概念。继承的出现简化了程序中的代码,使得我们不必重复的写着功能相同的代码。继承的出现也为多态的出现做了一个铺垫。
继承”是面向对象软件技术当中的一个概念。如果一个类A继承自另一个类B,就把这个A称为”B的子类”,而把B称为”A的父类”。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。另外,为子类追加新的属性和方法也是常见的做法。父类也称作基类。
继承的举例:
父类:
#import <Foundation/Foundation.h>
@interface Animal : NSObject
{
int _age;
}
-(void)run;
@end
@implementation Animal
void)run{
NSLog(@"动物正在跑");
}
@end
子类:
#import <Foundation/Foundation.h>
//继承的格式@interface Dog:父类名
//要导入父类的头文件
#import "Animal.h"
@interface Dog : Animal
-(void)lookHome;
@end
@implementation Dog
-(void)lookHome{
NSLog(@"狗进入警戒状态");
}
@end
子类继承父类的格式:@interface 子类名:父类名
子类继承父类后将继承父类所有的方法和实例变量(私有的实例变量除外)。
派生类的介绍:子类继承了父类的方法和实例变量外,自己还有属于自己的方法和实例变量。如上面例子:狗类不仅继承了动物类跑的属性,还有了新的属性:看家。派生类的方法属性=基类方法属性+派生类新增的方法和属性。
继承注意:基类的私有属性能被继承,不能被使用。
OC中的继承是单继承:一个类只能有一个父类。
第三章 多态
多态按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
简单的说多态:
不同的对象以自己的方式响应父类同名的方法,这就是多态
多态的体现:
父类的指针指向了子类的对象
多态的条件:
1) 有继承关系
2)有方法重写(子类把父类的同名方法给重写了)
多态的示例:
父类:
#import <Foundation/Foundation.h>
@interface Animal : NSObject
{
int _age;
}
-(void)run;
@end
@implementation Animal
void)run{
NSLog(@"动物正在跑");
}
@end
子类1:
#import <Foundation/Foundation.h>
#import "Animal.h"
@interface Dog : Animal
@end
@implementation Dog
-(void)run{
//狗类重写了跑的方法
NSLog(@"狗正在跑");
}
@end
子类2:
#import "Animal.h"
@interface Cat : Animal
@end
@implementation Cat
-(void)run{
//猫类重写了跑的方法
NSLog(@"猫正在跑");
}
@end
程序的调用
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//父类指针 指向了 子类对象
//使用了多态
Animal *dog = [Dog new];
[dog run];
Animal *cat = [Cat new];
[cat run];
//多态的使用注意
Animal *a = [Dog new];
[a eat]; //报错,eat是狗类的新方法,a不是Dog类
// (Dog *)a 把a强制转化为 Dog类型
[(Dog *)an6 eat]; //正确的
//下面的用法是错误的
Animal *b = [Animal new];
[b eat]; //不可以,错误的用法
//下面也是错的
[(Dog *)a8 eat];
}
return 0;
}