OC第二天—封装

本文详细介绍了面向对象编程中实例变量的可见度修饰符,包括默认的protected修饰符、public、private修饰符的使用场景及注意事项。同时,文章通过实例展示了如何正确使用点语法和自定义初始化方法,确保类的封装性和可维护性。
/.锁定头文件的方法
1. 打开终端
2. 进入到Xcode的目录, 命令:   cd /Applications/Xcode.app
3. 把系统头文件修改为只读, 命令:   sudo chown -hR root:wheel Contentss
4. 好处:防止误删,误改头文件!
__________________________________________________________________
2、封装
   封装的目的:就是为了达到高内聚低耦合;
   内聚:模块内部各部分之间的关联程度;
   耦合:模块与模块之间的关联程度;
  内聚和耦合有一个条件改变,必然会导致另一个条件改变(耦合低了,内聚必然增高)(eg:甲乙城市的例子);
Person.h
@interface Person : NSObject
//实例变量
{
   
//实例变量可见度修饰的实例变量范围:从书写的哪一行开始,到下一个修饰符结束,或者碰到大括号结束;
   
@public
    NSString *_name;
    @protected//被protected被保护的, 修饰的实例变量只能在内部和子类中直接访问。直接就是通过实例变量名来访问
   
NSInteger _age;
   
NSString *_sex;
    @private //私有的,被private 修饰的实例变量 只能在类的内部直接访问 子类中也不可以访问
    NSString *_clour;}
//被protected修饰的实例变量不能在类的外边访问,这时需要给这些实例变量增加赋值的方法
//设置器  set 方法
//设置器的书写格式
1>对象方法  以 - 号开头
 2>返回值类型一定是void
 3>方法名一定以set 开头,后面跟上实例变量去掉下划线并且首字母大写
 4>一定有参数,并且参数类型要和实例变量的类型保持一致,参数名就是实例变量去掉下划线
//age 的setter 方法
- (void)setAge:(NSInteger )age;
//访问器 get 方法
- (NSInteger)age;
//声明_sex的get方法
- (NSString *)sex;
- (void)setClour:(NSString *)clour;
- (NSString *)clour;
访问器的书写格式:
 1>对象方法,以 - 开头
 2>一定有返回值,且返回值类型要和实例变量的类型保持一致
 3>方法名实例变量去掉下滑线
 */
//声明_sex的getter方法
- (void)setSex:(NSString *)sex;
Person.m
@implementation Person
- (
void)setAge:(NSInteger )age{
   
//通过外界传输的参数给实例变量赋值
    _age = age;   
}
- (
void)setSex:(NSString *)sex{
   
_sex = sex;
}
- (
NSInteger)age{
   
//get方法返回的是实例变量
   
return _age;
}
- (NSString *)sex{
   
//get方法返回的是实例变量
   
return _sex;
}
//@private的访问
- (void)setClour:(NSString *)clour{
   
_clour = clour;
}
- (
NSString *)clour{
    return _clour; 
}
@end
main.m
   Person *p = [[Person alloc]init];
    p ->_name = @"索宁师妹";

    //调用_age 的setter方法
   [p setAge:18];
    //调用_sex的setter方法
    [p setSex:@"妖"];

    //调用_age的getter方法
   NSInteger pAge =  [p age];
//这两种都可以
    NSLog(@"年龄:%ld",pAge);
   
NSLog(@"年龄是:%ld",[p age
]);
   
//调用_sex的getter方法
   
NSString *pSex = [p sex];
    
NSLog(@"性别是:%@",pSex);
   NSLog(@"性别是:%@",[p sex]); 
//    p ->_clour = @"黄种人”;  error!!!
    [p setClour:@"绿色"];
   NSLog(@"%@",[p clour]);
3、 总结三种实例变量的可见度
  系统默认的实例变量可见度修饰符:@protected
     @public  修饰的实例变量虽然可以在类的内部直接访问,但是它破坏了类的封装思想,所以以后祥哥建议不要使用
4、点语法:
      1》点语法后面有赋值运算符(=)的时候调用的是实例变量的 setter 方法,后面没有赋值运算符(=)的时候用的是实例变量的getter 方法;
       2》点语法知识系统提供一种快速调用setter 和getter 方法的快捷方式,只有写了实例变量的 setter 和 getter 方法才能使用点语法;
Student.h
@interface Student : NSObject
//实例变量
{
   
NSString *_name;//名字
   
NSString *_sex;//性别
   
NSString *_clour;//肤色
   
NSInteger _age;//年龄
   
CGFloat _weight;//体重   可以设置只写的
//    @private
   
NSInteger _number;//学号  可以设置只读的
}
//重写父类的init方法
- (id)init;
//由于学号不允许学生修改,此时值提供getter 方法
- (NSInteger)number;
//由于体重是学生的密码,此时只提供setter方法
- (void)setWeight:(CGFloat)weight;
Student.m
//由于学号不允许学生修改,此时值提供getter 方法
- (
NSInteger)number{
   
return _number
;
}
//由于体重是学生的密码,此时只提供setter方法
- (
void)setWeight:(CGFloat)weight{
   _weight =weight;
}
main.m
 NSLog(@"%ld ",stu.number); 
    stu.weight 50.0;
5、类方法 类方法的好处和使用场合:不依赖于对象,执行效率高,能使用类方法解决的问题尽量使用类方法;
//场合:当方法内不需要使用实际变量的时候,可以改为类方法;
例子:Calculator.h
@interface Calculator : NSObject
//计算两个数的和
+ (
CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber;
//计算两个数的和
- (CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber;
@end
Calculator.m
@implementation Calculator
//计算两个数的和
+ (
CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber{
   
return number +OtherNumber;
}
//计算两个数的和
- (
CGFloat)oneNumber : (CGFloat)number plusOtherNumber : (CGFloat)OtherNumber{
   
return number +OtherNumber;
}
@end
main.m
//调用计算器类的方法
   CGFloat result = [Calculator oneNumber:34.0 plusOtherNumber:56.0];
    NSLog(@"%.2lf",result);
    //调用计算器的对象方法
   
Calculator *cal = [[Calculator alloc]init];
    result = [cal
oneNumber:50.0 plusOtherNumber:50.0];
   NSLog(@"%.2lf",result);
6、自定义初始化条件 
好处:把初始化和对实例变量的赋值结合在一起
例子:Boy.h
@interface Boy : NSObject
{    NSString *_name;//名字
   
NSString *_gender;//性别
   
NSInteger _age;//年龄
   CGFloat _height;//身高}
//重写隐匿的方法
- (id)init;
//自定义初始化方法和格式
- (id)initWithName : (NSString *)name;
//完全初始化方法
//遵循小驼峰命名法
- (
id)initWithName:(NSString *)name
                   gender : (
NSString *)gender
                         age : (
NSInteger)age
                     height : (CGFloat)height;
- (void)setName : (NSString *)name;
- (NSString *)name;
- (void)setGender : (NSString *)gender;
- (NSString *)gender;
- (void)setAge : (NSInteger)age;
- (NSInteger)age;
- (void)setHeight : (CGFloat)height;
- (CGFloat)height;
@end
Boy.m
@implementation Boy
- (
id)init{
   
_name = @"俊强";
   
_gender = @"纯爷们";
   
_height = 180;
   
return self;
}
- (
id)initWithName:(NSString *)name
           gender : (
NSString *)gender
              age : (
NSInteger)age
           height : (
CGFloat)height{
   
//使用方法中的参数给实例变量赋值
   
_name = name;
   
_gender = gender;
   
_age = age;
   
_height = height;
   
return self;
}
- (
id)initWithName : (NSString *)name{
   
_name = name;
   
return  self;
}

- (
void)setName : (NSString *)name{
   
_name = name;
}
- (
NSString *)name{
   
return  _name;
}
- (
void)setGender : (NSString *)gender{
   
_gender = gender;
}
- (
NSString *)gender{
   
return _gender;
}
- (
void)setAge : (NSInteger)age{
   
_age = age;
}
- (
NSInteger)age{
   
return _age;
}
- (
void)setHeight : (CGFloat)height{
   
_height = height;}
- (
CGFloat)height{
   return _height;
@end
main.m
 Boy *b = [[Boy alloc]init];
   
NSLog(@"%@ %@ %ld %.2lf",b.name,b.gender,b.age,b.height);
   
//部分自定义
   
Boy *b1 = [[Boy alloc]initWithName:@"李梦"];
   
NSLog(@"%@ %@ %ld %.2lf",b1.name,b1.gender,b1.age,b1.height);
   
//全部自定义
   
Boy *b2 = [[Boy alloc]initWithName:@"土川" gender:@"妖" age:23 height:16];
    NSLog(@"%@ %@ %ld %.2lf",b2.name,b2.gender,b2.age,b2.height);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值