在这一blog中将继续运用上次的Car 类进行OC三大特性的学习,将三大特性运用到上次的例子当中。
一、封装
1.set 和get方法
set方法是能够提供一个方法,使得外部定义的类的对象能够给默认的成员变量(protected)赋值。
set 方法的命名必须以set 开头,成员变量的首字母必须是大写的,返回值是void,必须要有一个参数,参数的类型跟成员变量的参数类型是一致的。
get 方法能够返回对象内部的成员变量的值,所以get方法是有返回值的,并且返回值的类型跟成员变量的对应的类型是一致的。
成员变量的命名规范:成员变量的命名一定要用下划线 _ 开头,这样就可以使得成员变量的名称跟get方法的名称进行区分,而不用使得get 方法的参数重新命名;也可以使得成员变量的名称跟局部变量区分开来。
下面的代码是使用set 和 get 方法之后的Car的类和实现以及调用的代码:
#import <Foundation/Foundation.h>
//声明对象的属性和行为
@interface Car : NSObject
{
//声明对象属性,成员变量默认是protected,且成员变量不能初始化,不能在外部被直接调用,不能使用static关键字进行修饰
// @public
int _wheels;
int _speed;
}
//声明方法
- (void)run;
- (void)info;
//带参数的方法
- (void)setWhees:(int)wh andSpeed:(int)sp;
//wheels的set方法
- (void)setWheels:(int)wheels;
//wheels的get方法
- (int)wheels;
//speed的set方法
- (void)setSpeed:(int)speed;
//speed的get方法
- (int)speed;
@end
@implementation Car
//实现方法
- (void)run
{
NSLog(@"车子在跑。。。。");
}
//在实现方法中可以直接调用类的成员变量
- (void)info
{
NSLog(@"车子的轮子有%d个,车子的速度是:%d",_wheels,_speed);
}
//带参数的方法
- (void)setWhees:(int)wh andSpeed:(int)sp
{
_wheels = wh;
_speed = sp;
}
//set方法
- (void)setWheels:(int)wheels
{
if(wheels <= 0)
{
_wheels = 1;
}
_wheels = wheels;
}
//get方法
- (int)wheels
{
return _wheels;
}
//speed的set方法
- (void)setSpeed:(int)speed
{
if (speed <= 0) {
speed = 1;
}
_speed = speed;
}
//speed的get方法
-(int)speed
{
return _speed;
}
@end
//定义一个方法
//void changeSpeed(Car *car)
//{
// car->speed = 100;
//}
int main()
{
Car *c = [Car new];
//调用成员变量,只有成员变量是public 时,才可以调用成员变量
// c->wheels = 4;
// c->speed = 200;
//调用方法
// [c run];
// [c info];
//调用方法,改变对象的成员变量的值
// changeSpeed(c);
// [c info];
//调用对象的方法,改变成员变量的值
[c setWhees:3 andSpeed:500];
[c info];
//匿名对象
// [Car new]->wheels =18;
// [[Car new] run];
//调用get set 方法
[c setWheels:10];
[c setSpeed:1000];
[c info];
NSLog(@"%d,%d",[c wheels],[c speed]);
return 0;
}
运行结果是:
使用封装可以让我们定义在类中的成员变量选择是实现get方法还是set方法,有时候我们可能希望某个成员变量不允许被修改,而是只能被访问,所以这时候我们就可以只实现这一成员变量的get方法,而不实现set方法来实现这一效果。
二、类方法和self关键字
1.类方法是以 + 号开头的方法,只能使用类名来调用类方法,类方法中不能访问成员(实例)变量,类方法中不依赖于对象,执行效率要比对象方法高,在不访问对象成员变量的条件下,我们应尽量使用类方法来实现所需要的功能。当对象方法和类方法的名称相同时是允许的。具体的例子加入Car类中的效果如下所示:
#import <Foundation/Foundation.h>
//声明对象的属性和行为
@interface Car : NSObject
{
//声明对象属性,成员变量默认是protected,且成员变量不能初始化,不能在外部被直接调用,不能使用static关键字进行修饰
// @public
int _wheels;
int _speed;
}
//声明方法
- (void)run;
- (void)info;
//声明类方法
+ (void)info;
//带参数的方法
- (void)setWhees:(int)wh andSpeed:(int)sp;
//wheels的set方法
- (void)setWheels:(int)wheels;
//wheels的get方法
- (int)wheels;
//speed的set方法
- (void)setSpeed:(int)speed;
//speed的get方法
- (int)speed;
@end
@implementation Car
//实现方法
- (void)run
{
NSLog(@"车子在跑。。。。");
}
//在实现方法中可以直接调用类的成员变量
- (void)info
{
NSLog(@"车子的轮子有%d个,车子的速度是:%d",_wheels,_speed);
}
//实现类方法
+ (void)info
{
NSLog(@"调用了类方法,我是不能访问成员变量的");
}
//带参数的方法
- (void)setWhees:(int)wh andSpeed:(int)sp
{
_wheels = wh;
_speed = sp;
}
//set方法
- (void)setWheels:(int)wheels
{
if(wheels <= 0)
{
_wheels = 1;
}
_wheels = wheels;
}
//get方法
- (int)wheels
{
return _wheels;
}
//speed的set方法
- (void)setSpeed:(int)speed
{
if (speed <= 0) {
speed = 1;
}
_speed = speed;
}
//speed的get方法
-(int)speed
{
return _speed;
}
@end
//定义一个方法
//void changeSpeed(Car *car)
//{
// car->speed = 100;
//}
int main()
{
Car *c = [Car new];
//调用成员变量,只有成员变量是public 时,才可以调用成员变量
// c->wheels = 4;
// c->speed = 200;
//调用方法
// [c run];
// [c info];
//调用方法,改变对象的成员变量的值
// changeSpeed(c);
// [c info];
//调用对象的方法,改变成员变量的值
[c setWhees:3 andSpeed:500];
[c info];
//匿名对象
// [Car new]->wheels =18;
// [[Car new] run];
//调用get set 方法
[c setWheels:10];
[c setSpeed:1000];
[c info];
[Car info];
// NSLog(@"%d,%d",[c wheels],[c speed]);
return 0;
}
运行的结果是:
2. self用来指向当前的对象,所以我们可以使用"self->成员变量名" 来访问当前对象内部的成员变量,而利用[self 方法名] 可以调用其他对象方法或者是类方法:具体的例子代码如下:在Car类的对象方法setWheels中,_wheels 成员变量的访问也可以直接换成
self ->_wheels, 我们可以在setWhees:(int) andSpeed:(int) 方法中调用setWheels 方法
@implementation Car
//实现方法
- (void)run
{
NSLog(@"车子在跑。。。。");
}
//在实现方法中可以直接调用类的成员变量
- (void)info
{
NSLog(@"车子的轮子有%d个,车子的速度是:%d",_wheels,_speed);
}
//实现类方法
+ (void)info
{
NSLog(@"调用了类方法,我是不能访问成员变量的");
}
//带参数的方法
- (void)setWhees:(int)wh andSpeed:(int)sp
{
[self setWheels:wh];
[self setSpeed:sp];
}
//set方法
- (void)setWheels:(int)wheels
{
if(wheels <= 0)
{
self->_wheels = 1;
}
self->_wheels = wheels;
}
//get方法
- (int)wheels
{
return _wheels;
}
//speed的set方法
- (void)setSpeed:(int)speed
{
if (speed <= 0) {
speed = 1;
}
_speed = speed;
}
//speed的get方法
-(int)speed
{
return _speed;
}
@end
运行结果是:
915

被折叠的 条评论
为什么被折叠?



