黑马程序员学习笔记_OC之三大特性之封装
面向对象的三大特性(精华):(成员变量、方法)封装、继承、多态。
1、 为什么需要封装?
根据以前学的内容,假如我声明一个student类,里面有public成员age.。我在主函数中写代码 student *s = [studentnew]。这样的话我可以通过s→age修改age的值,但是会出现s→age=-10这种赋值,但是我们都知道年龄不可能为-10岁,我们没有办法阻值这种不合理的赋值。
我们改变访问成员变量的方法,使得该方法能够滤掉不合理的赋值。
2、 Set方法:不能直接修改成员变量,去掉@public
在方法中改变成员变量,提供一个方法设age属性值
命名规范:方法名必须以set开头
Set后面跟上成员变量名,首字母必须大写
返回值一定是void
形参名称不能跟成员变量一致
3、 get方法:作用是返回对象内部成员变量,但不直接使用,而是通过方法
命名规范:肯定有返回值,返回类型与成员变量一致
方法名跟成员变量名一致
不需要接受任何参数
4、 实例
#import<Foundation/Foundation.h>
@interface Student :NSObject
{
int age;
}
- (void) study;
- (void)setAge : (int) newAge; //set方法
- (int)age; //get方法
@end
@implementationStudent
- (void)study
{
NSLog(@“%d岁的学生在学习”,age);
}
- (void)setAge : (int) newAge
{
if (newAge<=0) //实现过滤数据赋值的功能
{
newAge= 1;
}
age = newAge ;
}
- (int)age
{
return age;
}
@end
int main()
{
Student *stu= [Student new ];
[stu setAge :10]; //set方法向age赋值
[stu study];
NSLog(@“学生的年龄是%d岁”,[stu age]); //get方法获取age的值
return 0;
}
5、 封装的好处;把细节、内部成员隐藏在里面,保证了数据的安全性。有时候不会提供set方法和get方法,例如成员变量中如果有只读成员变量,只需提供get方法,不提供set方法即可。
6、 成员变量的命名规范:一定要以下划线_开头。好处为:
1> 观察4中实例里发现get的方法名和成员变量名一致,容易混淆。加入下划线可以区分这两个。
2> 可以跟局部变量区分开,一看到下划线开头的变量,一般都是成员变量,方便交流。
实例:
#import<Foundation/Foundation.h>
typedef enum{
SexWoman;
SexMan;
} Sex;
@interface Student:NSObject
{
Sex _sex;
}
- (void)setSex:(Sex)sex;
- (void)sex;
@end
@implementation Student
- (void)setSex:(Sex)sex
{
_sex=sex;
}
- (void)sex
{
return_sex;
}
int main()
{
Student *stu = [Student new];
[stu setSex:SexWan];
[stu sex];
return 0;
}