黑马程序员——ObjectiveC基础——封装、@property和点语法
2015-10-18 22:25
579 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、概述
面向对象的三个特性是:封装、继承、多态。
不封装的缺陷:当一个类把自己的属性暴露给外部的时候,该类就失去了对属性的管理权。
一个类,将自身的属性对外隐藏起来,只有通过此类提供的方法才能访问或设置实例变量,不可被外部任意调用或修改,这种机制叫做封装。
封装可以提高类的安全性,降低数据被误用的可能性。
在OC语言中,使用@interface和@implementation来处理类。@interface对类的属性和方法进行声明,向外部提供展示以及接口。@implementation则负责实现声明的方法,对外隐藏了具体实现。
通过在类中定义实例变量的设置器和访问器实现类的封装。
二、设置器和访问器的具体实现
1.设置器(setter)
Set方法的作用:为外界提供了一个设置成员变量值的方法。
要求:
1)方法名必须以set开头。
2)Set后边跟上成员变量的名称(去掉下划线),首字母大写。
3)返回值一定为void。
4)一定接受一个参数,这个参数的数据类型要和设置的成员变量的数据类型一致。
5)形参名不能喝成员变量重名。
使用设置器的好处:
1)不让数据暴露在外,保证数据安全性。
2)可以对设置的数据进行验证或过滤。
2.访问器(getter)
get方法的作用:为调用者返回对象内部的成员变量。
要求:
1)一定有返回值,返回值的类型和成员变量的返回值类型一致。
2)方法名和成员变量名一样。
3)不需要接受任何参数。
示例代码:
现在有一个成绩类 。
其中包括语文、数学、平均分三个变量
要求:语文、数据两个变量可读可写,平均分变量只读,当语文、数学两个变量有任何一个值改变时,平均分的值随之变化。
Chengji.h
Chengji.m
main.m
三、@property
在Xcode4.4版本以上,可以通过在声明文件中使用@property关键字实现设置器和访问器的设置。
例如:
成员变量 int _age; 可以如下声明:
@property int age;
示例代码
Person.h
Person.m
main.m
四、点语法
点语法是XCode特性,XCode帮助我们做了代码替换。
Person 类的属性_age,并且该属性拥有set和get方法。此时:
p.age xcode会判断p.age 是set还是get方法,从而自动替换着这些代码。
注意:
点语法的本质是方法调用,而不是访问成员变量。当一个变量没有set和get方法时,是无法使用点语法的。
在set/get的函数中,不能使用self.变量名的点语法,会方法的死循环(一个方法,不能调用它本身)
一、概述
面向对象的三个特性是:封装、继承、多态。
不封装的缺陷:当一个类把自己的属性暴露给外部的时候,该类就失去了对属性的管理权。
一个类,将自身的属性对外隐藏起来,只有通过此类提供的方法才能访问或设置实例变量,不可被外部任意调用或修改,这种机制叫做封装。
封装可以提高类的安全性,降低数据被误用的可能性。
在OC语言中,使用@interface和@implementation来处理类。@interface对类的属性和方法进行声明,向外部提供展示以及接口。@implementation则负责实现声明的方法,对外隐藏了具体实现。
通过在类中定义实例变量的设置器和访问器实现类的封装。
二、设置器和访问器的具体实现
1.设置器(setter)
Set方法的作用:为外界提供了一个设置成员变量值的方法。
要求:
1)方法名必须以set开头。
2)Set后边跟上成员变量的名称(去掉下划线),首字母大写。
3)返回值一定为void。
4)一定接受一个参数,这个参数的数据类型要和设置的成员变量的数据类型一致。
5)形参名不能喝成员变量重名。
使用设置器的好处:
1)不让数据暴露在外,保证数据安全性。
2)可以对设置的数据进行验证或过滤。
2.访问器(getter)
get方法的作用:为调用者返回对象内部的成员变量。
要求:
1)一定有返回值,返回值的类型和成员变量的返回值类型一致。
2)方法名和成员变量名一样。
3)不需要接受任何参数。
示例代码:
现在有一个成绩类 。
其中包括语文、数学、平均分三个变量
要求:语文、数据两个变量可读可写,平均分变量只读,当语文、数学两个变量有任何一个值改变时,平均分的值随之变化。
Chengji.h
#import <Foundation/Foundation.h> @interface ChengJi : NSObject { float _yuwen; float _shuxue; float _pingjunfen; } -(void)setYuwen:(float)yuwen; -(float)yuwen; -(void)setShuxue:(float)shuxue; -(float)shuxue; -(float)pingjunfen; @end
Chengji.m
#import "ChengJi.h" @implementation ChengJi -(void)setYuwen:(float)yuwen{ _yuwen = yuwen; _pingjunfen = (_shuxue+_yuwen)/2; } -(float)yuwen{ return _yuwen; } -(void)setShuxue:(float)shuxue{ _shuxue = shuxue; _pingjunfen = (_shuxue+_yuwen)/2; } -(float)shuxue{ return _shuxue; } -(float)pingjunfen{ return _pingjunfen; } @end
main.m
#import <Foundation/Foundation.h> #import "ChengJi.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... ChengJi *cj = [ChengJi new]; [cj setYuwen:85.5f]; [cj setShuxue:90.0f]; NSLog(@"\n小明的成绩:语文:%.2f 数学:%.2f 平均分:%.2f",[cj yuwen],[cj shuxue],[cj pingjunfen]); } return 0; }
三、@property
在Xcode4.4版本以上,可以通过在声明文件中使用@property关键字实现设置器和访问器的设置。
例如:
成员变量 int _age; 可以如下声明:
@property int age;
示例代码
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject { int _age; NSString *_name; } @property int age; @property NSString *name; @end
Person.m
#import "Person.h" @implementation Person @end
main.m
#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [Person new]; [p setName:@"Bob"]; [p setAge:12]; NSLog(@"姓名%@:年龄%d",[p name],[p age]); //姓名Bob:年龄12 } return 0; }
四、点语法
点语法是XCode特性,XCode帮助我们做了代码替换。
Person 类的属性_age,并且该属性拥有set和get方法。此时:
p.age xcode会判断p.age 是set还是get方法,从而自动替换着这些代码。
注意:
点语法的本质是方法调用,而不是访问成员变量。当一个变量没有set和get方法时,是无法使用点语法的。
在set/get的函数中,不能使用self.变量名的点语法,会方法的死循环(一个方法,不能调用它本身)
#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [Person new]; p.setName = @"Bob"; p.setAge = 12; NSLog(@"姓名%@:年龄%d",p.name,p.age); //姓名Bob:年龄12 } return 0; }
相关文章推荐
- [Object C]_[初级]_[NSArray排序]
- django get_object_or_404
- 黑马程序员——ObjectiveC基础——继承与实例变量修饰符
- Objective-C Foundation框架实践——NSMutableDictionary(一)
- window.url.createobjecturl 兼容多种浏览器(IE,google,360,Safari,firefox)
- Objective-C Foundation框架实践——NSDictionary(一)
- EF学习和使用(八)你必须知道的效率问题根源之Expression<Func<TObject, bool>>与Func<TObject, bool>
- objective-c基础教程
- [Javascript] Creating an Immutable Object Graph with Immutable.js Map()
- 黑马程序员——ObjectiveC基础——类对象和SEL类型
- Objective-C Foundation框架实践——NSMutableArray(一)
- Objective-C Foundation框架实践——NSArray(二)
- 黑马程序员——ObjectiveC基础——动态类型检测
- Objective-C Foundation框架实践——NSArray(一)
- Objective-C Foundation框架实践——NSMutableString(一)
- Objective-C Foundation框架实践——NSString(四)
- Objective-C Foundation框架实践——NSString(三)
- Objective-C Foundation框架实践——NSString(二)
- Objective-C Foundation框架实践——NSString(一)
- Object类的常用方法