码迷,mamicode.com
首页 > 其他好文 > 详细

04-面向对象语法03

时间:2015-05-19 18:23:26      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

一、 set方法和get方法

1. set方法和get方法的使用场合

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

2. set方法

1) 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值

2) 命名规范:

? 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写

? 形参名称不能跟成员变量同名

? 返回值一定是void

3. get方法

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

2) 命名规范:

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

b) 方法名跟变量名一样

c) 不需要任何参数

4. 成员变量的命名规范

? 成员变量都以下划线 _ 开头

? 可以跟get方法的名称区分开

? 可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量

5. 代码示例

#import <Foundation/Foundation.h>

// 声明

@interface Car : NSObject

{

int _wheels; // 轮子个数

}

/*set方法*/

- (void) setWheels:(int)wheels;

/*get方法*/

- (int) wheels;

@end

@implementation Car

// set方法的实现

- (void) setWheels:(int)wheels

{

// 对外面传进来的轮子数进行过滤

if (wheels<=0)

    {

wheels = 1;

    }

_wheels = wheels;

}

// get方法的实现

- (int) wheels

{

return _wheels;

}

@end

6. 封装的好处

? 过滤不合理的值

? 屏蔽内部的赋值过程

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

7. 练习

/*

 4.设计一个成绩类

 1> 属性

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

 * OC成绩 (可读可写)

 * 总分  (只读)

 * 平均分 (只读)

*/

#import <Foundation/Foundation.h>

@interface Score : NSObject

{

int _CScore;//C语言成绩

int _OcScore;//OC成绩

int _TotalScore;//总分

int _AverageScore;//平均分

}

- (void)setCScore:(int)CScore;

- (int)CScore;

- (void)setOcScore:(int)OcScore;

- (int)OcScore;

- (int)TotalScore;

- (int)Average;

@end

@implementation Score

- (void)setCScore:(int)CScore

{

    _CScore = CScore;

//计算成绩

    _TotalScore = _CScore + _OcScore;

    _AverageScore = _TotalScore/2;

}

- (int)CScore

{

return _CScore;

}

- (void)setOcScore:(int)OcScore

{

    _OcScore = OcScore;

//计算成绩

    _TotalScore = _CScore + _OcScore;

    _AverageScore = _TotalScore/2;

}

- (int)OcScore

{

return _OcScore;

}

- (int)TotalScore

{

return _TotalScore;

}

- (int)Average

{

return _AverageScore;

}

@end

int main()

{

    Score *s = [Score new];

    [s setCScore:50];

    [s setOcScore:80];

    NSLog(@"%d----%d",[s TotalScore],[s Average]);

return 0;

}

二、 OC弱语法

//弱语法1

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

@end

int main()

{

    Person *p = [Person new];

// OC是在运行过程中才会检测对象有没有实现相应的方法

    [p test];

//编译连接 不报错误,运行时报错

//unrecognized selector sent to instance  不能识别消息发送给那个对象

return 0;

}

//弱语法2

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

- (void) test

{

    NSLog(@"哈哈哈");

}

@end

int main()

{

    Person *p = [Person new];

// OC是在运行过程中才会检测对象有没有实现相应的方法

    [p test];

//编译连接 不报错误,运行时报错

//unrecognized selector sent to instance  不能识别消息发送给那个对象

return 0;

}

//弱语法3

#import <Foundation/Foundation.h>

//@interface Person : NSObject

//

//@end

@implementation Person : NSObject

- (void) test

{

    NSLog(@"哈哈哈");

}

@end

int main()

{

    Person *p = [Person new];

// OC是在运行过程中才会检测对象有没有实现相应的方法

    [p test];

//编译连接 不报错误,运行时报错

//unrecognized selector sent to instance  不能识别消息发送给那个对象

return 0;

}

三、 类方法

1. 基本概念

直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)

2. 类方法和对象方法对比

1) 对象方法

? 以减号-开头

? 只能让对象调用,没有对象,这个方法根本不可能被执行

? 对象方法能访问实例变量(成员变量)

2) 类方法

? 以加号+开头

? 只能用类名调用,对象不能调用

? 类方法中不能访问实例变量(成员变量)

? 使用场合:当不需要访问成员变量的时候,尽量用类方法

3) 类方法和对象方法可以同名

3. 常见错误代码

#import <Foundation/Foundation.h>

@interface Person : NSObject

//方法以+开头

+ (void)printClassName;

- (void)text;

@end

@implementation Person

+ (void)printClassName

{

    NSLog(@"这个类叫做Person");

}

- (void)text

{

    NSLog(@"调用了text方法");

}

@end

int main()

{

//找不到方法

//[Person text];

// Person *p = [Person new];

/*

     -[Person printClassName]: unrecognized selector sent to instance 0x7fa692f001e0‘

     */

// 系统会认为现在调用的printClassName是一个对象方法

//[p printClassName];

return 0;

}

4. 类方法练习

/*

设计一个计算器类

 * 求和

 * 求平均值

*/

第一种方法

#import <Foundation/Foundation.h>

@interface JiSuanQi : NSObject

- (int)sumOfNum1:(int)num1 andNum2:(int)num2;

- (int)averageOfNum1:(int)num1 andNum2:(int)num2;

@end

@implementation JiSuanQi

- (int)sumOfNum1:(int)num1 andNum2:(int)num2

{

return num1 + num2;

}

- (int)averageOfNum1:(int)num1 andNum2:(int)num2

{

return (mun1 + num2) / 2;

}

@end

int mian()

{

    JiSuanQi *jsq = [JiSuanQi new];

    [jsq sumOfNum1:10 andNum2:13]

return 0;

}

每一次使用计算器类都要创建一个计算器对象

第二种方法 (代码优化)

/*

设计一个计算器类

 * 求和

 * 求平均值

 */

#import <Foundation/Foundation.h>

//工具类:基本没有任何成员变量,里面的方法基本都是类方法

@interface JiSuanQi : NSObject

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;

@end

@implementation JiSuanQi

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2

{

return num1 + num2;

}

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2

{

return (mun1 + num2) / 2;

}

@end

int mian()

{

//JiSuanQi *jsq = [JiSuanQi new];

    [JiSuanQi sumOfNum1:10 andNum2:13]

return 0;

}

第三种方法 (代码优化)

/*

设计一个计算器类

 * 求和

 * 求平均值

 */

#import <Foundation/Foundation.h>

//工具类:基本没有任何成员变量,里面的方法基本都是类方法

@interface JiSuanQi : NSObject

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;

@end

@implementation JiSuanQi

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2

{

return num1 + num2;

}

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2

{

return [JiSuanQi sumOfNum1:num1 andNum2:num2] / 2;

}

@end

int mian()

{

//JiSuanQi *jsq = [JiSuanQi new];

    [JiSuanQi sumOfNum1:10 andNum2:13]

return 0;

}

四、 self关键字

1. 成员变量和局部变量同名

? 当成员变量和局部变量同名时,采取就近原则,访问的是局部变量

? 用self访问成员变量,区分同名的局部变量

2. 使用细节

1) 出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数

2) 作用

? 概念:指向了当前对象(方法调用者)

? 使用 "self->成员变量名" 访问当前方法调用的成员变量

? 使用 "[self 方法名];" 来调用方法(对象方法\类方法)

3. 常见错误

? 低级错误:用self去调用函数

? 类方法中用self调用对象方法,对象方法中用self调用类方法

? self死循环

4. 示例

a) 示例1

#import <Foundation/Foundation.h>

@interface Person :NSObject

{

int _age;

}

- (void)setAge:(int)age;

- (int)age;

- (void)test;

@end

@implementation Person

- (void)setAge:(int)age

{

    _age = age;

}

- (int)age

{

return _age;

}

- (void)test

{

//self : 指向了方法调用者,代表着当前对象

int _age = 20;

    NSLog(@"Person的年龄的%d岁",self->_age);

}

@end

int main()

{

    Person *p = [Person new];

    [p setAge:10];

    [p test];

return 0;

}

a) 示例2

#import <Foundation/Foundation.h>

@interface Dog :NSObject

- (void)bark;

- (void)run;

@end

@implementation Dog

- (void)bark

{

    NSLog(@"汪汪汪");

}

- (void)run

{

    [self bark];

    NSLog(@"跑跑跑");

}

@end

int main()

{

    Dog *d = [Dog new];

    [d run];

return 0;

}

a) 示例3

/*

设计一个计算器类

 * 求和

 * 求平均值

 */

#import <Foundation/Foundation.h>

//工具类:基本没有任何成员变量,里面的方法基本都是类方法

@interface JiSuanQi : NSObject

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;

@end

@implementation JiSuanQi

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2

{

return num1 + num2;

}

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2

{

//在这种情况下 self代表类

return [self sumOfNum1:num1 andNum2:num2] / 2;

}

@end

int mian()

{

//JiSuanQi *jsq = [JiSuanQi new];

    [JiSuanQi sumOfNum1:10 andNum2:13]

return 0;

}

5. self使用注意点

注意点一

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)test;

@end

@implementation Person

- (void)test

{

    NSLog(@"调用了test方法");

    [self test]; //会应发死循环

}

@end

int main ()

{

    Person *p = [Person new];

[p text];

return 0;

}

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)test;

+ (void)test;

@end

@implementation Person

- (void)test

{

    NSLog(@"调用了test - 方法");

//[self test]; //会应发死循环

}

+ (void)test

{

    NSLog(@"调用了test + 方法");

    [self test];//会应发死循环

}

@end

int main ()

{

    [Person test];

//    Person *p = [Person new];

//    [p text];

return 0;

}

注意点二

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)test;

+ (void)test;

- (void)test1;

+ (void)test2;

@end

@implementation Person

- (void)test

{

    NSLog(@"调用了test - 方法");

//[self test]; //会应发死循环

}

+ (void)test

{

    NSLog(@"调用了test + 方法");

//[self test];//会应发死循环

}

- (void)test1

{

    [self test];//-text 

}

+ (void)test2

{

    [self test];// + text

}

@end

int main ()

{

//[Person test];

    Person *p = [Person new];

    [p text1];

return 0;

}

输出结果

2015-05-19 15:22:46.304 a.out[1225:2200685] 调用了test - 方法

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)test;

+ (void)test;

- (void)test1;

+ (void)test2;

@end

@implementation Person

- (void)test

{

    NSLog(@"调用了test - 方法");

//[self test]; //会应发死循环

}

+ (void)test

{

    NSLog(@"调用了test + 方法");

//[self test];//会应发死循环

}

- (void)test1

{

    [self test];

}

+ (void)test2

{

    [self test];

}

@end

int main()

{

    [Person test2];

//Person *p = [Person new];

//[p test1];

return 0;

}

 

输出结果

2015-05-19 15:24:49.124 a.out[1229:2215202] 调用了test + 方法

04-面向对象语法03

标签:

原文地址:http://www.cnblogs.com/sundaboke/p/4515001.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!