面向对象技术总结

面向对象设计的目标

可扩展性

Extensibility

系统可以很容易增加功能,而对原有的系统影响很小

灵活性

Flexibility

  1. 模块相对独立,通信尽可能少
  2. 当一个模块修改时,对别的模块影响很小

可替换性

Pluggability

  1. 当一部分不在满足需要时,可以将旧的部分用新的轻松替换
  2. 系统“在线升级”功能就是很好的说明

面向对象的总体原则

  1. 针对接口编程,而不是针对实现编程

    1. 客户无需知道所使用的的对象的特定类型
    2. 只需要知道对象拥有客户所期望的接口
  2. 优先使用对象组合,而不是类继承
    1. 对象组合:一个含有其他对象的类称为组合类,比如使用的扩展实体
    2. 继承在某种程度上破坏了封装性、子类父类耦合度高,父类修改后会影响子类
    3. 而对象组合只要求被组合的对象具有良好定义的接口。耦合度降低,一个类的修改对于其他类影响很小
  3. 封装变化点
    1. 使用封装创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不影响另一侧,从而实现层次键的松耦合
    2. 同一层如果某个接口不固定也可以通过多态封装变化点,简单工厂的使用就是例子

面向对象的常用原则

  1. “开-闭”原则(Open-Close Principle OCP)

    1. 约束对象如何对可变性封装问题
    2. 一个软件系统应当对扩展开放,对修改关闭
    3. 添加新功能时应该只是向代码集中添加新的代码,不应该修改原本的代码
  2. 里氏替代原则(Liskov Substitution Principle LSP)

    1. 约束子类和父类如何替换的问题
    2. 要求子类可以无条件的替代父类,例如多态的时候使用父类类型作为参数,但是实际传递的还是子类对象
  3. 依赖倒转原则(Dependence Inversion Principle DIP)

    1. 要求开发中针对接口编程(业务依赖于接口,而不是实现)

    2. 在进行业务设计时,应尽量在接口或抽象类中定义业务方法,并且通过具体的实现类(或子类)来实现业务方法

      业务方法的修改将不会影响到运行时业务方法的调用,比如抽象工厂IDAL和DAL之间的关系

  4. 聚合复用原则(Composite/Aggregate Reuse Principle CARP)

    1. 尽量使用组合/聚合、尽量不要使用继承
    2. 在一个新的对象里面使用一些已有的对象,使之成为新的对象的一部分
    3. 新的对象通过向这些对象的委派达到复用这些对象的目的
  5. 迪米特法则(Law Of Demeter LOD)

    1. 耦合度问题:尽量“不要和陌生人说话”
    2. 一个软件实体应当尽可能少的与其他实体发生相互作用
    3. 初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块独立,相互之间不存在依赖关系
  6. 接口隔离原则(Interface Separate Principle ISP)

    1. 要求接口的职责单一
    2. 使用多个专门的接口比使用单一的总接口要好,也就是说,一个类对另外一个类的依赖性应当是建立在最小的接口上
  7. 其他原则:类的职责明确原则等。。。

单例模式

所谓单例,就是整个程序有且仅有一个实例。该类负责创建自己的对象,同时确保只有一个对象被创建

    public  class Admin{public static Admin Instance = null;public static Admin CreateInstance(){if (Instance==null){Instance = new Admin();}return Instance;}}

创建对象实例时

            Admin adm = Admin.CreateInstance();

.NET新特性

推断类型

var可以根据变量的初始值自动推断局部变量的类型

  1. var只能定影局部变量,而不能定义成员变量
  2. 定义的时候必须同时完成初始化,而不能使用var定义变量为NULL
  3. var本身并不是一种新的类型,只是用来修饰一个可推断出具体类型的局部变量

var定义变量和object类型定义的区别


匿名类

什么是匿名类

        static void Main(string[] args){var objPerson = new { Name="小明",Age=20,ClassName="C#"};Console.WriteLine("有一个学生叫{0},班级是{1}",objPerson.Name,objPerson.ClassName);Console.ReadLine();}

特点:

  1. 直接使用var关键字声明,并且使用new关键字创建对象
  2. 不需要提前编写类的成员,并且只能添加对象的属性

扩展方法

扩展方法定义

  1. 扩展方法必须在静态类中定义
  2. 扩展方法是一种特殊的静态方法
  3. 第一个参数前必须加关键字this,this后面的这个数据类型不是参数类型,这个类型代表这个方法是给哪个对象扩展的
  4. 参数的命名表示当前变量
        public static int Calc(this Student stu,int a,int b){return a + b;}
            Student stu = new Student() { Name = "张三", Age = 20 };Console.WriteLine("3+5="+ stu.Calc(3,5));Console.ReadLine();

不带参数的扩展方法

static 方法名 (this 目标类型 目标类型参数){}

带参数的扩展方法

static 方法名(this 目标类型 目标类型参数,参数1,参数2,....)

扩展方法注意

  1. 扩展方法必须定义在静态类中,扩展方法本身也是静态方法
  2. 如果扩展方法和对应的类位于不同的命名空间,使用时应引入扩展方法所在的静态类的命名空间
  3. 当类本身的方法与扩展方法重名时,类本身的方法是被优先调用的
  4. 扩展方法不要过多使用
  5. 扩展方法也支持重载

扩展方法作用

问题:公司购买了一个第三方编写的模块用于项目开发,该模块被封装在了DLL中,现在需要针对第三方模块中某一个类增加一个方法,该怎么办?

解决防范:

  1. 使用继承,但是存在风险(有可能这个类还是最终类sealed)

  2. 使用扩展方法解决上面问题

委托

https://blog.csdn.net/chonbi/article/details/103897842

Lambda表达式

https://blog.csdn.net/chonbi/article/details/103967570

夜来风雨声,对象知多少。相关推荐

  1. python 类 对象 知乎_GitHub - egrcc/zhihu-python: 获取知乎内容信息,包括问题,答案,用户,收藏夹信息...

    zhihu-python:获取知乎信息 注意: 本项目不再维护更新! zhihu-python 采用 Python2.7 编写,用来方便地获取知乎上各种内容的信息,并且可以方便地将答案备份导出为 tx ...

  2. python 类 对象 知乎_python基础知识:类,对象,模块三者的区别

    长话短说,我线代作业还没有写呢. 有点编程语言知识的朋友应该知道,编程语言有"面向对象"和"面向过程"两种. 解释一下:面向对象技术是目前流行的系统设计开发技术 ...

  3. python一切都是对象 知乎_python一切皆对象

    1. 一切皆对象 1.1 先了解类 故事要从一切皆对象开始讲起,与对象相伴的一个概念叫类,类就好比模板,对象都是根据这个模板刻画衍生出来的. 比如下面这行简单的代码 a = int('3') prin ...

  4. 等保2.0.等保对象知多少

    文章目录 简介 等级保护对象 信息系统 通信网络设施 数据资源 定级对象的划分 小结 简介 在等保2.0的过程中,会有很多个对象,这些对象分别指的是什么?在测评过程中如何进行选择?本文将从等保定级的角 ...

  5. 不用代码,10分钟会采集微博、微信、知乎、58同城数据和信息

    点击上方蓝字关注公众号 码个蛋第268次推文 一个"刮刀"全搞定 作者:书生婉悠 博客:https://www.jianshu.com/u/46175078f805 学会信息和数据 ...

  6. spring框架学习(三)

    一.Spring自动组件扫描 Spring 提供组件扫描(component scanning)功能.它能从指定的classpath里自动扫描.侦测和实例化具有特定注解的组件. 基本的注解是@Comp ...

  7. java做的web系统 m1 读卡器 结合_IE浏览器接入IC卡读写器实现M1卡的读写功能

    基于ActiveX技术的ocx控件是实现网页上读写 IC卡的一个比较不错的方法,因为ocx是com组件,通过其发布的接口,IE可以实现所有的功能.ActiveX不仅能适应大部分编程语言,做到与编程语言 ...

  8. MATLAB2016笔记(九):概率统计( 概率密度、统计作图、统计特征、累积概率分布、随机变量产生)

    文章目录 一.产生随机变量 (一)二项分布随机数据的产生 binornd (二)正态分布随机数据的产生 normrnd (三)常见分布随机数据的产生 二.概率密度计算 (一)通用函数概率密度值 pdf ...

  9. 山东大学人机交互考试重点

    人机交互定义 广义 人机交互是关于设计.评价和实现供人们使用的交互式计算机系统,且围绕这些方面的主要现象进行研究的学科 广义上讲,人机交互是以实现自然.高效.和谐的人机关机为目的,与之相关的理论和技术 ...

最新文章

  1. mac搭建ios自动化环境之WebDriverAgent配置
  2. 简明python教程 --C++程序员的视角(八):标准库
  3. ssm 框架配置详解
  4. [NOIP2006] 数列
  5. [vue] 说下你对指令的理解?
  6. 雨课堂知识点总结(七)
  7. Android Activity launchMode研究
  8. 从中报危机看创业板:谁在兜售“上市经济”?
  9. 帕萨特加载模式启用怎么解除_大众帕萨特VCDS刷隐藏功能方法
  10. 评价法(二):模糊综合评价的步骤和方法
  11. oppo自带计算机版本,OPPO手机助手
  12. LeetCode-Python-1386. 安排电影院座位(数组)
  13. EQ一卡通踩过的坑,解决加载不到动态库,输出数据到led屏乱码问题
  14. pytorch crnn 笔记(二)
  15. 关于win10X64 连接oracle
  16. 淘宝美工设计就业怎么样?零基础学淘宝美工设计怎么学?
  17. CMD/DOS学习笔记
  18. 如何连接并处理 sdf 数据库文件(便捷数据库处理)
  19. win10系统电脑声音图标正常,但没有声音
  20. 微博将于今日晚间挂牌上市 最高融资金额4.37亿美元

热门文章

  1. 机器学习——一元线性回归和多元线性回归
  2. 安卓9.0设置WIFI静态IP地址。
  3. Windows打开局域网共享快捷方式脚本制作
  4. 如何用django来创建一个网站
  5. 数据结构与算法--第二章pro题解
  6. 计算机输入密码不满足密码策略,密码不满足密码策略的要求windowsserver2008/2012...
  7. 牛叔说电影-圣堂四骑士
  8. Cocos2D中的Framerate状态
  9. linux强大的convert命令(可以对图像做各种处理!)
  10. 基于百度云通过Python实现简单的营业执照识别