Object-C技术学习,更多资源请访问 https://www.itkc8.com
// main.m
// OC封装
//
// Created by Goddog on 15/1/2.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
/*
1.封装的理解:(1)指将对象对状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类提供的方法来实现
对内部信息的操作和访问。
(2)隐藏类的实现细节,让使用者只能通过事先预定的方法来访问数据,从而可以在该类方法里加入控制逻辑,限制
对成员变量的不合理访问。
(3)将对象的成员变量和实现细节隐藏起来,不允许外部直接访问,
把方法暴露出来,让方法来控制对这些成员变量进行安全的访问和操作。总之,该隐藏的隐藏,该暴露的暴露。
2.使用访问控制符: (1)@private(当前类访问权限),该类成员变量被修饰之只能在当前类的内部访问,实现部分定义的成员变量
默认是使用这种访问权限。
(2)@package(与映像访问权限相同),当前类和当前类实现的同一个映像的任意地方访问。
(3)@protected(子类访问权限),当前类和当前类的子类任意地方访问,类的接口部分默认使用的就是该权限
(4)@public(公共访问权限),任意地方可以访问。
3.如果一个OC类的每个成员变量都被使用@private限制,并为每个成员变量都提供setter和getter方法,这才是符合规范。
4.原则:(1)类里绝大部分成员变量应该使用@private限制,但是有些方法只是辅助实现该类的其他方法(工具方法),把这些方法定
义在类的实现部分则可。
(2)如果某个类要作为父类,则用@protected限制这些成员变量
(3)希望暴露出来给其他类自由调用的方法应该在类接口部分定义,然后在类实现部分实现它们。
*/
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//实例化
Person* person = [[Person alloc] init];
//不能直接调用类,因为是@private,并且会编译错误
//person->_age=99;
//通过set方法才行
[person setAge:88];
[person setName:@"huxu123"]; //值不符合要求
NSLog(@"姓名时:%@,年龄:%d",[person name],[person age]);
}
return 0;
}
//
// Person.h
// OC封装
//
// Created by Goddog on 15/1/2.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
//使用@private限制成员变量
{
@private
NSString* _name;
int _age;
}
//提供方法来操作name
-(void) setName:(NSString*) name;
//提供方法来获取_name成员变量的值
-(NSString*) name;
//提供方法来设置age
-(void) setAge:(int) age;
//提供方法来获取_age成员变量的值
-(int) age;
@end
//
// Person.m
// OC封装
//
// Created by Goddog on 15/1/2.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import "Person.h"
@implementation Person
//提供方法来设置_name成员变量
-(void) setName:(NSString *)name
{
//执行合理的验证用户名字在1至4个字之间
if ([name length] > 4 || [name length] < 1)
{
NSLog(@"您设置的名字不符合要求!");
}
else
{
_name = name;
}
}
//提供方法来获取_name成员变量的值
-(NSString*) name
{
return _name;
}
//提供方法设置_age的值
-(void) setAge:(int)age
{
//执行合理的验证,要求用户年龄必须在0到100之间
if (_age != age) {
if (age > 100 || age < 0)
{
NSLog(@"您设置的年龄不合法!");
}
else
{
_age = age;
}
}
}
//提供获取_age的方法
-(int) age
{
return _age;
}
@end
Object-C技术学习,更多资源请访问 https://www.itkc8.com