一、面向对象和封装
面向对象的三大特性:封装、继承和多态
在OC语言中,使用@interface和@implementation来处理类。
@interface就好像暴露在外面的时钟表面,像外界提供展示以及接口。@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来。
二、Set方法在开发的过程中,考虑到安全行的要求,我们一般不再成员变量前面使用@public、@protected等关键字修饰,而是使用Set方法来为对象提供成员变量的值。在Set方法中也可以对一些不合理的值进行一些筛选。
Set 方法的作用:为外界提供一个设置成员变量值的方法
命名规范:
1、方法名必须以set开头
2、set方法后面跟上成员变量的名称,首字母大写
3、返回值一定是void
4、一定要接受一个参数,而且参数类型需要和成员变量的类型一致
5、形参名不能和成员变量名一样
Set的方法好处
1、不让数据暴露在外,保证了数据的安全性
2、对数据进行筛选
Set方法使用实例:
Set方法声明:
#import <Foundation/Foundation.h>
@interface Person:NSObject
{
//这里不再使用@public关键字
int _age;
}
//set方法的声明,接受一个参数
-(void)setAge:(int)age;
- (void)print;
@end
Set方法实现
#import"Person.h"
@implementation Person
//set 方法的实现
-(void)setAge:(int)age
{
_age=age;
}
-(void)print
{
NSLog(@"age=%d",_age);
}
@end
主程序实现
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p=[[Person alloc]init];
//使用set方法设置person类对象age的值
[p setAge:10];
[p print];
}
return 0;
}
结果:
2015-03-12 22:50:39.233类练习[492:17060] age=10
三、Get方法
Get方法的作用:为调用者返回对象内部的成员变量
命名规范:
1、一定要有返回值,返回值的类型和成员变量类型一致
2、方法名和成员变量名一样
3、不需要接受任何参数
Get方法使用实例:
Get方法的声明
#import <Foundation/Foundation.h>
@interface Person:NSObject
{
NSString *_name;
}
//set方法
-(void)setName:(NSString *)name;
//get方法
-(NSString *)name;
@end
Get方法的实现
#import"Person.h"
@implementation Person
//set 方法的实现
-(void)setName:(NSString *)name
{
_name=name;
}
-(NSString *)name
{
return _name;
}
@end
主程序
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc,constchar * argv[]) {
@autoreleasepool {
Person *p=[[Personalloc]init];
//使用set方法设置person类对象age的值
[psetName:@"ChengLei"];
//使用get方法获取成员变量的值
NSLog(@"%@",[pname]);
}
return0;
}
注意:
在实际开发中不一定set和get方法都会提供,如果内部的成员变量比如学生的学号这样的数据只允许外界读取不允许修改的情况,通常只提供get方法不提供set方法。
成员变量命名以下划线_开头,get方法名不需要带下划线,使用下划线有两个好处:1、与get方法的方法名区分开来2、可以和其他一些局部变量区分开来,下划线开头的变量通常都是泪的成员变量。
四、Self关键字
Self是一个指针,谁调用了当前方法,self就指向了谁【出现在对象方法中,就代表了当前对象,出现在类方法中,就代表了当前类】
self 的用途:
1、可以利用self->成员变量名 访问当前对象内部的成员变量(仅在对象方法中使用)
2、[self 方法名]. 可以调用其他的对象方法或者类方法
五、练习
成绩类声明
/*
设计一个成绩类,这个成绩类有以下四个属性
OC成绩可读可写
C成绩可读可写
总分可读
平均分可读
*/
@interface Score:NSObject
{
int _OCScore;
int _CScore;
int _Sum;
double _average;
}
//set方法
-(void)setOCScore:(int)ocscore;
//get方法
-(int)ocscore;
-(void)setCScore:(int)cscore;
//get方法
-(int)cscore;
-(int)sum;
-(double)average;
@end
成绩类实现
#import"Score.h"
@implementation Score
//set 方法的实现
-(void)setOCScore:(int)ocscore
{
_OCScore=ocscore;
}
-(int)ocscore
{
return_OCScore;
}
-(void)setCScore:(int)cscore
{
_CScore=cscore;
_Sum=_OCScore+_CScore;
_average=_Sum/2;
}
-(int)cscore
{
return_CScore;
}
-(int)sum
{
return_Sum;
}
-(double)average
{
return_average;
}
@end
#import <Foundation/Foundation.h>
#import "Score.h"
int main(int argc,constchar * argv[]) {
@autoreleasepool {
Score *S=[[Scorealloc]init];
[SsetOCScore:80];
[SsetCScore:90];
NSLog(@"sum=%d",[Ssum]);
NSLog(@"average=%.2f",[Saverage]);
[SsetCScore:100];
NSLog(@"sum=%d",[Ssum]);
NSLog(@"average=%.2f",[Saverage]);
}
return0;
}
测试结果2015-03-12 23:21:38.883类练习[577:25962] sum=170
2015-03-12 23:21:38.884类练习[577:25962] average=85.00
2015-03-12 23:21:38.885类练习[577:25962] sum=180
2015-03-12 23:21:38.885类练习[577:25962] average=90.00