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

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值