您的位置:首页 > 职场人生

黑马程序员-面向对象的三大特性1-封装-set,get方法,弱语法

2014-07-01 17:19 281 查看
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
封装
set方法和get方法、

@public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检、水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数

代码示例

/*封装:成员变量的封装.

封装的好处:

过滤不合理的值

屏蔽内部的赋值过程.

让外界不必关注内部的细节.

*/

typedef enum

{

   SexMan,

   SexWoman

} Sex;

@interface Student : NSObject

{

   //@public
以后尽量不要写成@public,这样是扣分的

   int age;

 

   //只允许修改不允许访问.只用set

   //只允许外界访问no,不允许修改no
只需要提供get方法,也就是只读。

   int no;

  

   /*成员变量名的命名规范:一定要以下划线 _ 开头

   作用:

   1.将变量与方法名分开。

   2.可以讲局部变量与成员变量分开。下划线开头的变量一般都是成员变量。

   */

   Sex _sex;

}

 

- (void)study;

 

/*set方法

1,作用 :提供一个方法给外界设置成员变量值,并且可以在方法里对参数进行相应过滤

2 命名规范:

1>方法名必须以set开头

2>set后面跟上成员变量的名称,成员变量的首字母大写

3>返回值一定是void

4一定要接受一个参数,而且参数类型跟成员变量类型一致

5形参的名称不能跟成员变量名一样

*/

- (void)setAge:(int)newAge;

 

 

- (void)setSex:(Sex)sex;

- (Sex)sex;

 

/*

get 方法

1,作用:返回对象内部的成员变量

2命名规范

1>肯定有返回值,返回值类型肯定与成员变量一致

2>方法名跟成员变量名一样

3>不需要接受任何参数

*/

- (int)age;

 

@end

 

@implementation Student

 

- (void)study

{

   NSLog(@"%d的学生在学习",age);

}

 

 

- (void)setAge:(int)newAge //成员变量的封装,保证数据的安全性

{

   //对传进来的参数进行过滤

   if (newAge <=0)

   {

       newAge=1;

   }

   age=newAge;

}

 

- (int)age

{

   return age;

}

 

 

- (void)setSex:(Sex)sex;

{

   //_sex = newSex;

   _sex = sex;

}

 

- (Sex)sex;

{

   //return sex;返回的不知道是成员变量还是方法

   return _sex

}

 

@end

int main()

{

   Student *stu = [Student new];

   //stu->age = 22;/*这里随意改成员变量,不符合封装概念,不安全。将@public去掉,不要把成员变量暴露在外面给别人修改。*/

 

   [stu setAge:10];//好处,传-10自动过滤[stu setAge:-10]

   [stu setSex:SexMan];

   [stu setNo:10];

   [stu sex];

   [stu no];

   NSLog(@"学生的年龄是%d岁",[stu age]);   

   //[stu study];

   return 0;

}

 

 

/*

 4.设计一个成绩类

 * C语言成绩(可读可写)

 * OC成绩(可读可写)

 * 总分(只读)

 * 平均分(只读)

*/

#import <Foundation/Foundation.h>

 

@interface Score : NSObject

{

   int _cScore;//c语言成绩

   int _ocScore;//Oc成绩

//做法1,可以去除下面两个成员变量,返回两者,见下面set。get注释

   //int _sumScore;//总分

   //double _aveScore;//平均分

 

//做法2: 保留下面两者,见下函数

   int _sumScore;//总分

   double _aveScore;//平均分

}

- (void)setCScore;

- (int)cScore;

 

- (void)setOcScore;

- (int)ocScore

 

- (int)sumScore;

 

- (int)aveScorel;

 

@end

 

@implementation Score

 

- (void)setCScore

{

   _cScore = cScore;

  

   //计算总分平均分,
监听成员变量的改变


   _sumScore = _cScore + _ocScore;

 

   -aveScore = -sumScore/2;

}

 

- (int)cScore

{

   return _cScore;

}

 

- (void)setOcScore

{

   _ocScore = ocScore;

   _sumScore = _cScore + _ocScore;

   -aveScore = -sumScore/2;

}

 

- (int)ocScore

{

   return _ocScore;

}

- (int)sumScore

{

   //return _cScore+_ocScore;

   return _sumScore;

}

  

- (double)aveScore

{

   //return (_cScore+_ocScore)/2;

   return _aveScore;

}

 

 

@end

 

int main()

{

   Score *s =[Score new];

 

   [s setCScore:10];

   [s cScore];

  

   [s setOcScore:20];

   [s ocScore];

 

   int a = [s sumScore];

 

   int b =    [s aveScore];

  

   NSLog(@"总分%d",a);

 

   return 0;

}

 

弱语法:

一.[p test],未曾声明过test对象方法,

1.编译cc –c的时候会出现一个警告:

May not respon to test

如同C语言未声明的函数一样。

2.如果cc .o -framework Foundation

一点错误都没有

而在C语言中为报错。说函数未声明。

3../a.out

报错(其实这里就是程序崩溃闪退),一旦运行过程中崩溃就是闪退

unrecognized selector sent to instance

不能识别      消息    发送的    对象 

给person 对象发送了一条不能识别的消息:test

 

二,只有声明没有实现

报错

OC中方法调用是动态检测,在运行过程中才会检测对象有没有实现相应方法

三.只有实现没有声明(有个条件:必须写在main函数前面

方法:没有任何错误,也没有警告,这样写也是对的

如果是类:@implementation Person :
NSObject(在这里加上这个)不写类声明也是对的,但是开发中不会这么做,只是知道对就行了(仅仅有未声明的警告)


 

----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐