OC之封装与类之间的关系

时间:2022-08-10 21:55:35

1. 面向对象的特征-封装?

 

    封装: 

      现实生活中的封装: 将很多的小东西 塞在1个大口袋里面.

      好处:

      a. 对外部屏蔽.

      b. 方便管理.

 

      代码的封装:

      函数/方法 就是1种封装的体现: 将一段代码塞在函数/方法中.

      好处: 屏蔽了内部的实现. 便于管理.

 

      类是一种更高级别的封装:

      1个类中封装数据的状态和行为.

      将数据的状态和行为封装在了1个类中. 类中有很多复杂的实现. 对于外部而言无需关心.

      只需要知道这个类是干啥的? 怎么用?

 

      把哪些复杂的东西. 方法,属性.封装成1个类的整体.

 

 

 2. 遇到的问题

 

    为对象的属性赋值的时候,语法上只要赋值1个和属性的类型相同的数据都是可以的.

    但是情理上.不能为对象的属性随意赋值.

 

    比如:

    1个人对象的年龄属性.类型是int类型的.

    那这个时候.为这个对象的年龄属性赋值语法上只要是int类型都可以.

    -21e + 21e

 

    但是情理上.人的年龄应该是在0-200之间的整数 超过这个数据就有悖于常理.

    想到的解决方案: 修改属性的类型. 这样不靠谱的.

 

 

 3. 解决方案

 

    1). 要解决什么问题: 要求为对象的属性赋值的时候,赋值的数据要有限制.要经过的逻辑判断.

 

 

    2). 第一种解决方案:

 

        让创建对象的人,在为对象的属性赋值的时候,自己写1个逻辑判断来判断数据是否符合要求.

 

        这个时候,逻辑判断是由对象的使用者来写.

        使用者完全可以不写.

 

        问题: 强制.必须.

 

    3). 靠谱的解决方案:

 

        1). 先把类的属性的@public修饰符去掉.

            如果不去掉.外部是可以直接访问对象的这个属性的.

            外部可以直接访问的话.那么就可以随性的赋值.

 

            所以,把@public去掉.不给外部访问,不让外部直接赋值.

 

 

        2). 为类提供1个方法.这个方法的作用 专门用来为对象的属性赋值.

            这个方法叫做. setter 

 

            a.  这个方法一定是1个对象方法.

            b.  这个方法肯定没有返回值.因为这个方法做的事情就是为属性赋值.

            c.  这个方法的名字必须以set开头.再跟上这个属性的名字,去掉下环线,首字母大写.

            d.  这个方法一定有参数,参数的类型和属性的类型一致,参数名和属性名一致.只是去掉下划线.

            e.  在方法的实现中,判断参数的值是否符合逻辑.如果符合就将其赋值给属性,否则做默认处理.

            f.  外界如果想要为对象的属性赋值,是不能直接访问属性了.

                只能调用这个setter方法来为对象的属性赋值.

                而这个时候,setter方法对准备赋值的数据做了逻辑判断.

                如果符合逻辑就会赋值给对象的属性.否则就不会.

 

        3). 这样一搞. 想要取出对象的属性的值,也取不出来.因为属性根本就没有权限访问了.

            为类再提供1个方法. 这个方法专门用来返回对象的属性的值.

            这个方法叫做 getter

 

            a.  这个方法一定是1个对象方法,因为方法要访问当前对象的属性的值 并返回

            b.  这个方法必须有返回值.返回值的类型肯定是和属性的类型一致.

            c.  这个方法的名字 就是 这个属性的名字,去掉下划线.

            d.  这个方法一定是没有参数的.

            e.  这个方法的实现,很简单, 就是直接返回当前对象的属性的值.

            f.  这个时候,外界如果想要得到对象的属性的值,就只能必须调用对象的getter方法来拿到了.

 

 

        

      这样做的好处:在于可以过滤掉非法数据.

 

 

 

 

 

 4. 只读与只写封装.

 

    1).  如果属性的封装只有getter 没有setter

         那么这样的封装就叫做只读封装.

         就只能调用getter方法取值.不能调用setter方法赋值. 因为没有setter方法.

 

 

    2).  只写封装.

 

         属性的封装只有setter 没有getter

         那么这样的封装就叫做只写封装.

         就只能调用setter方法赋值.不能调用getter方法取值.因为美哦有getter方法

 

 5. 属性封装的规范.

 

    只要属性需要被外界访问.无论取值或者赋值的时候,是否有逻辑验证.

    都要为其封装getter和setter.

 

 类与类之间的关系.

 

 1. 组合关系

 2. 依赖关系

 3. 关联关系

 4. 继承关系

 

 

 

 

 

 

 

 

 1. 组合关系.

    1个对象是由多个对象组合起来的.

    比如.计算机对象. 是由主板对象、CPU对象、内存对象、硬盘对象...组合起来的.

    主板、内存、硬盘作为计算机对象的属性.

    那么这个时候,计算机对象和主板、内存、硬盘的关系为 组合关系.

 

 2. 依赖关系

    1个对象的方法的参数是另外1个对象.那么我们就说他们的关系是依赖关系.

    比如,B类是A类方法的参数,我们就说A类依赖于B类.

    美女打电话的例子.

 

    人类:

    callWithPhone:(Phone *)phone;

    我们就说人类依赖于电话类. 人要打电话 就必须要有电话对象.

 

    电话类:

    耦合度:  当修改1个对象的时候 对另外1个对象的影响程度. 

            A类和B类. 如果修改了B类. 发现A类就无法使用了,我们就说他们的耦合度很高.

 

    低耦合: 当修改1个对象的时候 对另外1个对象的影响较小甚至没有影响.

    高内聚: 1个对象仅仅做自己相关的事情. 跟自己无关的事情就不要写在类中.

            不要写1个大杂烩.

    单一职责原则. 1个类只做自己的事情.别人的事情给别人做.

 

 3. 关联关系

    关联体现的是两个类之间语义级别的一种强依赖关系,

    比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性 的,

    而且双方的关系一般是平等的。关联可以是单向、双向的。

    表现在代码层面,

    为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类 型为被关联类B的全局变量。

 

    案例:人使用iPad听歌.