2啥是抽象 ?
1:模糊,不清楚,不具体
eg 我是个好人 ;
oop很多规则就是这样:抽象,某个角度 好,换角度 不好!
2 抽取共象【很多类似对象,提取共性】
什么是面向对象
以对象为核心,在软件的分析设计实现中 遵循面向对象的设计原则并 使用封装继承,多态的技术, 就是面向对象。
举个例子
需求:实现主角打怪!
分析:面向过程【x以功能,方法,为单位】找功能:
一个类中:转向,走过去,打【顺序】
面向如何组织类或模块,让封装的类或组件,尽量只负责一个领域的工作对象【x以对象 类 为单位】 找对象{找角色}:
两个类:主角 怪 再找每个对象的共性:
面向对象的三大特征
1封装
如何组织类或模块,让封装的类或组件,尽量只负责一个领域的工作
什么是封装
从数据角度 将一些基本数据类型符合成一个自定义类型;(最多不要超过4个参数超过了建立一个新的类来管理)
从方法角度 将类外提供功能 隐藏实现的细节(把痛苦留个自己 方便留个其他人)
设计角度 分而治之 封装变化 高类聚 低耦合
好处
松散耦合 减低了程序各部分之间的依赖性
简单编程 使用者不必了解具体的实现细节 只需要调用对外提供的功能
增加安全性 特定的访问权限来使用类成员 保护成员不被意外修改
2继承
3多态
面向对象重要思想
分而治之 如 XX系统》子系统》组件【模块】》类
高内聚,低耦合
封装变化
面向对象的设计原则
1 开闭原则 :对扩展开放,对修改关闭
理想条件下的目标
eg 有个 项目 一 需要 class 1 F1() F2 ()
第二个 项目 用到 class1 F1() F2() F3()
问咋办
第一个解决方案 打开class1 写入 F3();
这种方式就违背了 开闭原则
第二个 解决方法 class2 继承 class1 写入 F3();
接口,组合,………
有的总是需要 对原来的做一定的修改
所以是理想的
2 类的单一职责 (一个类的定义)
设计 抽象得到的类:功能不要太多 越少越好
尽量有共性 把它放在同一类
一个类有且只有一个改变它的原因
3 面向接口编程而非面向实现 (写一个类时从哪入手)
先做好一个好对外的接口(公有的方法),
实现不是第一步要思考.
先思考做什么,为其他的组件提供什么功能,
而不是去先思考功能的实现
4使用组合而非继承 (复用的最佳实践)
如果仅仅为了复用优先选择组合复用,而非继承复用。
组合的耦合性对继承低
5 依赖倒置 倒转( 依赖抽象)
客户端代码尽量依赖抽象的组件,因为抽象的是稳定的。实现是多变的。
需求》 分析设计 具体主角 怪 【泛化】角色 抽象
实现 :父类抽象 特化 实现子类 具体
调用 依赖抽象 优先 Animal dog =new dog();
6里氏替换 (继承后的重写)
父类出现地方可以被子类替换掉。要保护替换前的原有的工作,在替换后依然保持不变
子类在重写父类方法时,尽量选择扩展重写。(用到父类的方法)
所有的子类都不用 全部重写 !写成抽象
子类要用到 父类那就写成虚方法
7 接口隔离 (功能拆分)
尽量定义小而精的接口,少定义大而全的接口
小接口之间功能隔离,实现类需要多个功能时可以选择多实现.或接口
8 迪米特法则
类与类交互时,在满足功能要求的基础上,
传递的数据量越少越好.因为这样可能降低耦合度。
追求的目标:代码低耦合 好!便于替换
类与对象 封装
类: 表示一个概念,包含数据(特征)和行为(能力),对象的抽象,没有状态
1) 定义:是一组相似事物的统称 学生【同学们】 一组对象
2) 构成:字段【数据>特征】 方法【>行为,功能】
学生类:id编号 name姓名 AttendClass上课Test考试
3) 语法:
class Student
{
public int id;
public void Test()
{
}
}
4)特点:对象的抽象,没有状态【字段的取值】
多个相似性的具体的对象 抽取共性得到;
Student id?id=?
zs zs.Id=1;
对象:表示一个实例,是类的实现,拥有状态
1) 定义:对象是new类得到的结果
实例化类得到的结果
类的实例化 【一个实例】
2) 语法:类名 对象名=new 类名();
3) 特点 :拥有状态 zs zs.Id=1;
关系:类对象 类是对象的模板;对象是类的实例
得到对象的目的:调用方法或字段!