OC语言中类的三大特性及本质(一)

OC语言同C++,C#,java等其他面向对象语言一样,都有类的概念。其他语言通常以关键字class声明一个类,但是OC语言却是以@interface声明一个类。

类的定义

OC类声明以@interface开头,后面紧跟类名,以@end结束。声明如下:

@interface classname
//声明成员变量和方法
@end

OC类实现以@implementation开头,后面紧跟类名,以@end结束。实现如下:

@implementation classname
//成员方法实现
@end

类的三大特性-封装、继承、多态

面向对象的语言的类通常有三大特性,封装、继承和多态。下面分别介绍。

类的封装

类的封装即对成员变量和成员方法的封装,通常通过以下关键字来体现类的作用域,即类的封装。
1. @private:此时类的成员变量只能在当前类的实现@implementation直接访问;
2. @protected:此时类的成员变量只能在当前类以及子类的实现@implementation能直接访问;
3. @public:任何地方都能直接访问类的成员变量;
4. @package:同一体系内(架构)可以直接访问,介于@private和@public之间。

类的继承

类的继承即子类可以拥有父类的成员变量及方法,然后子类还可以定义自己的成员变量和方法。
如下图是是一个类的继承关系。

Paste_Image.png
下面通过代码来先理解类的封装和继承这两大特性。
代码如下:

//Student类的声明
@interface Student:NSObject
{
@public
@property int age;//共有成员变量
@protected
@property float weight;//保护成员变量
@private
@property float height;//私有成员变量
}
- (void)setAge:(int)age andWeight:(float)weight andHeigth:(float)height;
@end
//Student类的实现
@implementation Student
- (void)setAge:(int)age andWeight:(float)weight andHeigth:(float)height
{
    _age = age;//正确,父类可以直接访问public成员
    _weight = weight;//正确,父类可以直接访问protected成员
    _height = height;//正确,父类可以直接访问private成员
}
@end

//子类Score的声明
@interface Score:Student  //继承自Student
- (void)setAge:(int)age andWeight:(float)weight;
@end
//Score类的实现
@implementation Score
- (void)setAge:(int)age andWeight:(float)weight
{
    _age = age;//正确,子类可以直接访问父类的public成员
    _weight = weight;//正确,子类可以直接访问父类的protected成员
    //_height = height;//错误,子类不可以直接访问父类private成员
}
@end

//主函数
void main()
{
    Score *s = [Score new];
    _age = 20;//正确,由于_age为public成员,可以直接访问
    _weight = 100;//错误,由于 _weight为protected成员,不可以直接访问
    _height = 150;//错误,由于 _height为private成员,不可以直接访问
}

类的多态

类的多态即父类的指针指向子类的对象,所以没有继承就没有多态。
下面通过代码理解。

//Student类的声明
@interface Student:NSObject
{
@private
@property float height;//私有成员变量
}
@end
//Student类的实现
@implementation Student

@end

//子类Score的声明
@interface Score:Student  //继承自Student
@private
@property float mathScore;//私有成员变量
- (void)setMathScore:(float)mathScore;
@end
//Score类的实现
@implementation Score
- (void)setMathScore:(float)mathScore
{
    _mathScore = mathScore;
}
@end

void main()
{
    //下面两行即多态的体现,使父类指针指向子类对象,并且调用子类的方法
    Student *s = [Score new];//父类指针指向子类对象
    [s setMathScore:90];//可以使用指向子类的父类指针调用子类的方法
}

关于OC类的三大特性总结到这里,下次总结一下类的本质。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值