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听歌.

oc之封装与类之间的关系的更多相关文章

  1. UML类图及类与类之间的关系

    原文地址:http://www.uml.org.cn/oobject/201211231.asp 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的 ...

  2. python基础学习笔记——类空间问题以及类之间的关系

    一. 类的空间问题 1.1 何处可以添加对象属性 class A: def __init__(self,name): self.name = name def func(self,sex): self ...

  3. 百万年薪python之路 -- 面向对象之:类空间问题以及类之间的关系

    面向对象之:类空间问题以及类之间的关系 1.从空间角度研究类 1.何处添加对象属性 class A: def __init__(self,name): self.name = name def fun ...

  4. Python面向对象 | 类空间及类之间的关系

    一. 类的空间问题 1何处可以添加对象属性 class A: def __init__(self,name): self.name = name def func(self,sex): self.se ...

  5. day22——从空间角度研究类、类与类之间的关系

    day22 从空间角度研究类 何处添加对象属性 在类的______init______可以添加 class Human: mind = "有思想的" def __init__(se ...

  6. Python进阶(十四)----空间角度研究类,类与类之间的关系

    Python进阶(十四)----空间角度研究类,类与类之间的关系 一丶从空间角度研究类 对象操作对象属性 class A(): address = '沙河' def __init__(self, na ...

  7. Python面向对象之:类空间问题以及类之间的关系

    一. 类的空间问题 1.1 何处可以添加对象属性   class A: def __init__(self,name): self.name = name def func(self,sex): se ...

  8. Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系

    Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...

  9. python 面向对象专题(二):类的空间问题、类与对象之间的关系、类与类之间的关系

    https://www.cnblogs.com/liubing8/p/11308127.html 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 ...

随机推荐

  1. FluentMigrator

    开源DataBase组件:FluentMigrator 2012-05-27 19:09 by 破狼, 2211 阅读, 4 评论, 收藏, 编辑 今天将介绍一款开源组件FluentMigrator, ...

  2. Samba(一)通过Samba搭建Linux文件服务器

    本文的目的是为了快速搭建一个linux文件服务器,主要是便于局域网电脑可以方便快速的获得Linux服务器共享的文档(非互传) samba是一个功能十分强大的软件,今天是我们的主角,因为本文是一个演示实 ...

  3. 图文解说PhpStorm 7.0版本语法着色

    前不久,我们测试了PhpStorm7.0版本对PHP 5.5的支持,今天我们将继续对PhpStorm 7.0版本对代码支持进行测试. 我们知道,在PhpStorm 6.0版本中,提供一个黑色背景的代码 ...

  4. NFTS数据流

    NFTS数据流 NTFS交换数据流(alternate data streams,简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每一个文件都能够存在多个数据流,就是说除了主文件流之外 ...

  5. easyui datagrid显示进度条控制操作

    在当我们需要控制时间前台实际项目页面datagrid显示进度条的数据加载时运行,和datagrid默认情况下只在有url加载运行时的数据显示方式的进度条.下面的代码手动控制: 打开一个进度条: $(' ...

  6. Varnish 4.0

    Varnish 4.0 实战   简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varn ...

  7. leetcode Binary Tree Postorder Traversal 二叉树后续遍历

    先给出递归版本的实现方法,有时间再弄个循环版的.代码如下: /** * Definition for binary tree * struct TreeNode { * int val; * Tree ...

  8. 领域模型中分散的事务如何集中统一处理(C#解决方案)

    领域模型中分散的事务如何集中统一处理(C#解决方案)   开篇 什么是事务,事务的应用场景 做项目时,经常会遇到一些需求,比如注册用户时,要求同时存入用户的基本信息和初始化该用户的帐户,如果在这两个环 ...

  9. Java多线程学习笔记——从Java JVM对多线程数据同步的一些理解

       我们知道在多线程编程中,我们很大的一部分内容是为了解决线程间的资源同步问题和线程间共同协作解决问题.线程间的同步,通俗我们理解为僧多粥少,在粥有限情况下,我们怎么去防止大家有秩序的喝到粥,不至于 ...

  10. Knockout 是什么?

    翻译:Knockout 轻松上手 - 1 Knockout 是什么? 原文名称:KnockoutJS Starter Knockout 是一个非常棒的脚本库,可是我发现许多人并不了解它,所以,思胜翻译 ...