OC是一门面向对象的变成语言,具有面向兑现的最基本的特征:封装性、继承性、和多态性。
一.封装
为何要用封装?
当定义了一个类时,类中的数据不允许外界访问,或者允许外界只能读取不能修改而需要隐藏时,就需要用到 set方法或者get方法。
1.OC中的set方法
作用:提供外界设置成员变量值,对参数进行过滤
规范:
1>方法名必须以set开头,后面跟上首字母大写的成员变量的名称
2>方法的返回值为void
3>方法形参的名称不能跟成员变量名一样
2.OC中的get方法
作用:返回对象内部的成员变量
1>方法的返回值类型与成员变量类型一致
2>方法名跟成员变量名一样
3>不需要接受任何参数
例如:
/*
*创建类Student
*成员变量:_age
*/
@interface Student :NSObject //类的定义
{
int _age;//代码规范,成员变量以下划线‘_’开头
}
- (void)setAge : (int)newage;//set方法的定义
- (void)age;//get方法的定义
- (void)study;//study方法的定义
@end
@implementation Student //类的实现
- (void)setAge : (int)newage //set方法的实现
{
//对传进来的值进行过滤
if(newage<0)
_age=19;
else
_age = newage;//把外部值传给内部成员变量
}
- (void)age //get方法的实现
{
return _age;//get函数返回值为成员变量_age
}
- (void)study //study方法的实现
{
NSLog(@"年龄为%d岁的学生在学习",_age);
}
@end
二、继承
继承的标识为英文的“:”冒号,使用继承可以定义一个具有父类所有功能(成员和方法)的新类,它继承了父类的功能。
为何要使用继承?
将所有重复的内容合并在一起,可以使代码有效率,简洁,才意味着是一个成功的架构。否则,修改代码时需要修改多处,就很容易出错。
1.继承的根类
大多都继承自 NSObject 类,所以在定义一个类时,要继承NSObject 类。
2.使用注意
1>父类要写在子类前面
2>OC中不允许子类中拥有和父类中相同名称的成员变量
3>OC中子类可以重写父类方法,当调用子类时优先调用子类方法
4>继承造成类与类之间耦合性太强,若父类不见,则子类不能使用
例如:
/*
*定义一个Person类,定义一个Student类,Student继承自Person,则Student为Person的子类,Person为Stuent的父类
/
@interfence Person :NSObject //定义父类
{
int _age;
double _weight;
}
- (void)eat;//定义父类方法
@end
@implementation Person //父类的实现
- (void)eat //实现父类方法
{
NSLog(@"此人的体重为:%f千克",_weight);
}
@end
@interfence Student : Person //定义子类继承Person类
{
int _sno;//学号
}
@end
@implementation Student
@end
//则虽然在子类Student中没有定义_age和_weight,因为子类继承了父类Person,所以子类拥有了父类中所有的成员和方法
三、多态
要想体现出多态性,则必须有继承。
1.多态的体现
父类指针指向了子类对象
2.多态的好处
1>参数中使用父类类型,则可以传入父类和子类对象
2>可以把多个函数整合为一个函数,简化代码
3.多肽的局限性
父类类型的变量不能用来调用子类的方法
例如:
/*
*定义两个类,一个为Animal为父类,一个为Dog为子类
*/
@interface Animal : NSObject
{
}
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"吃东西");
}
@end
@interface Dog : Animal
{
}
- (void)run;
@end
@implementation Dog
- (void)run
{
NSLog(@"跑起来了");
}
@end
//这个函数是专门用来喂动物的
void feed(Animal *animal)
{
[animal eat];
}
int main()
{
Dog *d = [Dog new];//d为指向狗类型的指针
feed(d);//可以传值d给feed函数的参数
Animal *a=[Animal new];//a为指向动物类型的指针
feed(a);/可以传值a给feed函数的参数
Animal *c=[Dog new];//将一个Dog对象的地址赋值给动物类型的指针c
[c run];//这里就是多态的局限性,父类Animal中并没有定义run方法,父类类型的变量 不能 用来调用子类的方法
feed(c);
return 0;
}