Objective-C中属性的封装

  1. 面向对象的三大特征是什么?

    封装 
    类就是更高级别的封装.类将数据和行为封装为了1个整体. 
    好处: 
    -> 屏蔽内部的实现.外界不需要知道内部是如何实现的 只需要知道这个对象有什么用. 
    -> 方便操作. 
    -> 后期的维护十分的便利.

    继承

    多态


    1. 存在的问题.

      就是为对象的属性赋值的时候 语法上其实只要数据的类型是属性的类型就是可以的. 
      但是,情理上这么做是不合的.

      就像Person对象有1个int类型的属性_age 表示1个人的年龄. 
      为这个对象的_age属性赋值的时候 其实只要是int类型的数据 语法上都是完全可以的. 
      但是1个人的年龄 正常情况下是在 0-200之间的.

      解决的问题: 
      在为对象的属性赋值的时候,我希望将这个数据做1个逻辑验证. 
      如果为属性赋的值在这个逻辑范围之内 那么我们就把这个值赋值给属性.否则我们就做默认处理.

      就像我们希望为Person对象的_age属性赋值的时候,要判断1下为_age属性赋的值是不是在0-200之内. 
      否则我们就做默认处理.

      3.如何实现这个需求

      1). 将属性的@public去掉.因为一旦写上@public就意味着外界可以直接访问对象的这个属性. 
      外界一旦可以直接访问这个属性 那么外界就可以任意的为这个属性赋值 这个时候你拦都拦不住.

      去掉@public 外界就无法直接访问这个属性 也就无法赋值了.

      2). 为类提供1个方法,这个方法专门为这个属性赋值.这个方法我们叫做setter 
      a. 这个方法一定是1个对象方法 因为这个要为属性赋值. 
      b. 这个方法没有返回值. 因为这个方法做的事情 仅仅是为属性赋值就可以了. 
      c. 这个方法的名称必须以set开头. 跟上去掉下划线首字母大写的属性名. 
      d. 这个方法一定是有参数的. 参数的类型和属性的类型一致.参数的名称和属性的名称一致(去掉下划线) 
      e. 在方法的实现中,判断传入的数据是否符合逻辑.如果符合逻辑则赋值 否则做默认处理. 
      f. 外界想要为对象的属性赋值 那么就调用这个对象的setter方法 将要赋值的数据传入给这个方法. 
      方法会对这个数据进行验证 如果符合验证 就会吧数据赋值给属性 否则就会做默认处理.

      3). 这么一写,我们确实可以在为对象的属性赋值的时候做1个逻辑验证了. 
      但是问题就是 在外界无法取出属性的值了. 
      那就再写1个方法,专门用来返回属性的值.这个方法我们叫做getter方法.

      a. 这个方法一定是1个对象方法 因为这个方法做的事情是拿到属性的值返回. 

      b. 这个方法肯定有返回值 返回值的类型和属性的类型一致. 
      c. 这个方法的名称直接就是属性的名称(去掉下划线的) 
      d. 这个方法没有参数 
      e. 这个方法的实现是直接将属性的值返回. 
      f. 这个时候,如果外界希望得到属性的值.那么就只需要调用这个getter方法就可以了.


      #import <Foundation/Foundation.h>
      
      @interface Person : NSObject
      {
          NSString *_name;
          int _age;
      }
      
      - (void)setName:(NSString *)name;
      - (NSString *)name;
      
      - (void)setAge:(int )age;
      - (int)age;
      @end
      
      #import "Person.h"
      
      @implementation Person
      
      - (void)setName:(NSString *)name{
          if(name.length >= 2){
              _name = name;
          }
          else{
              _name = @"无名";
          }
      }
      
      - (NSString *)name{
          return _name;
      }
      
      
      - (void)setAge:(int )age{
          if(age<200 && age >= 0)
          {
              _age = age;
          }
          else{
              _age = 18;
          }
      }
      
      - (int)age{
          return _age;
      }
      @end
      

      #import <Foundation/Foundation.h>
      #import "Person.h"
      
      int main(int argc, const char * argv[]) {
          
          Person *p1 = [Person new];
          [p1 setAge:22];
          [p1 setName:@"zx"];
          
          NSLog(@"我的名字是:%@",[p1 name]);
          NSLog(@"我的年龄是:%d",[p1 age]);
          return 0;
      }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值