您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C#教您一步步摆脱面向过程:依赖倒置

时间:2020-11-12 10:57:19  来源:  作者:

前面有几篇文章,已经教了一些方式或者方法,帮助您摆脱娘胎自带的面向过程编程,从而转为面向对象。

本文讲一下面向对象依赖倒置,使用具体的例子来解释可能好些,网上千篇一律的大多数文字描述,各位估计也不一定真的看明白了。于是,这就是本文的价值所在。

由于我一路走过来,所以,我写的关于面向对象的思想,都是实践性的经验,会站在您还是一个初学者的身份上去讲述它,尽量让读者明白。

本文例子出现的中文是为了便于理解,您实际编写代码时,不宜写中文。


一、什么是依赖倒置

普遍的解释是:程序要依赖于抽象接口,不要依赖于具体实现。

这话我当初看了无数遍,在我初期对面向对象理解还不深的时候,我认识这些字理解这些话,以为自己懂了,实际上,我压根不会用。很长一段时间的实践之后,我才终于明白这话的意思。

二、理解倒置

依赖倒置,倒置的意思就是反过来、翻转过来、倒转过来。本来是先看到头后看到尾的,倒立过来后,就先看到尾再看到头。总之就是反转过来。

三、理解依赖

当初我怎么都想不明白依赖是个啥东西,怎么回事。其实这是因为我当时对依赖不理解的原因,您今天不理解也正是因为这个原因。所以:

您需要了解UML中的关联和依赖。
您需要了解依赖注入中的依赖。
您需要了解属性的定义,这个应该好理解。
您需要了解方法的定义,这个应该好理解。

面向对象中的依赖倒置,既指UML中的关联,也指UML中的依赖,就是UML中的关联和依赖都要适合这个原则。

依赖注入中的依赖,指属性依赖以及方法的参数依赖,这2种都要适合这个原则。

C#教您一步步摆脱面向过程:依赖倒置

 

上图红圈的是方法的参数依赖,下图则是属性依赖。

方法参数依赖,是指传进去的方法参数,是一个对象。属性依赖是指返回值是一个对象。

C#教您一步步摆脱面向过程:依赖倒置

 

下图则是依赖注入的依赖,通常是构造函数的方法参数进行依赖,当然也有属性依赖注入的,就不举例子了。

C#教您一步步摆脱面向过程:依赖倒置

 

四、理解依赖后有什么用?

通过上面的第3点,您已经知道了什么叫依赖,但是你不知道依赖倒置的依赖,要怎么用?

其实就是指:上面第3点中的所有依赖,传递过去的参数(方法),或者返回值(属性),它们必须是抽象的。抽象是指抽象类和接口两种。使用依赖倒置,则建议您更好的方式是使用接口,因为接口是顶级抽象。

所以,您会看到,第3点的截图中,很多的依赖参数是传递的以字母I开头的接口。

五、按照这么做后,生产中实际会有什么效果?

是的,您现在知道了要怎么用。但您不知道为啥要这么用,用了后会怎么样,不用就又会怎么样?

C#教您一步步摆脱面向过程:依赖倒置

 

上图是一个形状接口,以及黑板类。在黑板上绘制一个图形,需要使用形状。

现在它的参数依赖是接口,所以,我可以传递正方形这个形状,也可以传递圆锥、圆柱这些形状。这就是依赖倒转的应用。

如果您不使用接口,比如直接参数要求传“正方形”,那么,这个“在黑板上绘制图形”的方法就是个死方法了,限定了只能传正方形对象。

 

祝您用餐愉快。



Tags:C#   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  Tags: C#  点击:(1)  评论:(0)  加入收藏
读取SQLite数据库,就是读取一个路径\\192.168.100.**\position\db.sqlite下的文件<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/...【详细内容】
2021-12-16  Tags: C#  点击:(21)  评论:(0)  加入收藏
一文看懂"async"和“await”关键词是如何简化了C#中多线程的开发过程当我们使用需要长时间运行的方法(即,用于读取大文件或从网络下载大量资源)时,在同步的应用程序中,应用程序本...【详细内容】
2021-12-01  Tags: C#  点击:(23)  评论:(0)  加入收藏
OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列...【详细内容】
2021-11-11  Tags: C#  点击:(50)  评论:(0)  加入收藏
在进行C#接口开发时经常需要将数据集转换成json返回,下面介绍一种将DataTable数据转换成实体类,然后再转换成json的方法。一、创建全病案类/// <summary> /// 全病案 //...【详细内容】
2021-11-04  Tags: C#  点击:(44)  评论:(0)  加入收藏
C# 获取网络路径文件大小信息的方法private void button1_Click(object sender, EventArgs e){label2.Text= GetInfo(textBox1.Text);}private string GetInfo(string URL){...【详细内容】
2021-10-29  Tags: C#  点击:(52)  评论:(0)  加入收藏
现如今二维码广泛应用,已经成为了生活中不可或缺的东西;所以我们日常的开发中,也少不了对二维码的生成或者解析。此文讲述一下使用C# 生成和解析二维码 实现功能:将字符串生成二...【详细内容】
2021-10-21  Tags: C#  点击:(58)  评论:(0)  加入收藏
最开始接触.net大概是2003年,当时用的还是framework1.1,那是CAM项目,使用.net主要是利用RemotingService做分布式开发,我当时做其中的一个子系统,因为之前一直都是C++开发,对C#一...【详细内容】
2021-08-17  Tags: C#  点击:(102)  评论:(0)  加入收藏
最近想自己做个录屏工具玩玩,使用的是ffmpeg,录屏是没有问题,在取麦克风及电脑声卡遇到了难题,ffmpeg也可以获取到设备名称但是没办法解析 ( 指令:ffmpeg -list_devices true -f d...【详细内容】
2021-08-04  Tags: C#  点击:(277)  评论:(0)  加入收藏
在实际的项目开发中,可能需要考虑代码的安全性或执行效率,需要将具体的功能实现隐藏,dll接口提供了很好的解决方案。dll接口不仅在C++的项目中可以直接调用,在C#开发的项目也同...【详细内容】
2021-07-09  Tags: C#  点击:(122)  评论:(0)  加入收藏
▌简易百科推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  中年农码工    Tags:C#   点击:(1)  评论:(0)  加入收藏
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  一起学嵌入式    Tags:C 语言   点击:(10)  评论:(0)  加入收藏
读取SQLite数据库,就是读取一个路径\\192.168.100.**\position\db.sqlite下的文件<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/...【详细内容】
2021-12-16  今朝我的奋斗    Tags:c#   点击:(21)  评论:(0)  加入收藏
什么是shellshell是c语言编写的程序,它在用户和操作系统之间架起了一座桥梁,用户可以通过这个桥梁访问操作系统内核服务。 它既是一种命令语言,同时也是一种程序设计语言,你可以...【详细内容】
2021-12-16  梦回故里归来    Tags:shell脚本   点击:(16)  评论:(0)  加入收藏
一、编程语言1.根据熟悉的语言,谈谈两种语言的区别?主要浅谈下C/C++和PHP语言的区别:1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互...【详细内容】
2021-12-15  linux上的码农    Tags:c/c++   点击:(17)  评论:(0)  加入收藏
1.字符串数组+初始化char s1[]="array"; //字符数组char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾会自动添&lsquo;\0&lsquo;printf("%s,%c\n",s1,s2[2]);...【详细内容】
2021-12-08  灯-灯灯    Tags:C语言   点击:(46)  评论:(0)  加入收藏
函数调用约定(Calling Convention),是一个重要的基础概念,用来规定调用者和被调用者是如何传递参数的,既调用者如何将参数按照什么样的规范传递给被调用者。在参数传递中,有两个很...【详细内容】
2021-11-30  小智雅汇    Tags:函数   点击:(19)  评论:(0)  加入收藏
一、问题提出问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?注:5,1,1和1 5 1属同一种方法m,n均小于10二、算法分析设f(m,n) 为m个苹果,n个盘子的放法数目,则先对...【详细内容】
2021-11-17  C语言编程    Tags:C语言   点击:(46)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  深度Linux    Tags:C++   点击:(37)  评论:(0)  加入收藏
OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列...【详细内容】
2021-11-11  zls315    Tags:C#   点击:(50)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条