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之间。
类的继承
类的继承即子类可以拥有父类的成员变量及方法,然后子类还可以定义自己的成员变量和方法。
如下图是是一个类的继承关系。
下面通过代码来先理解类的封装和继承这两大特性。
代码如下:
//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类的三大特性总结到这里,下次总结一下类的本质。