【C#语言入门】22. 接口、依赖反转、单元测试

【C#语言入门】22. 接口、依赖反转、单元测试

一、接口与单元测试

  • 接口的产生:自底向上(重构),自顶向下(设计)
  • C#中接口的实现(隐式,显式,多接口)
  • 语言对面向对象设计的内建支持:依赖反转,接口隔离,开/闭原则……

在这里插入图片描述

//不使用接口,会很麻烦
class Program
{static void Main(string[] args){int[] nums1 = new int[] { 1, 2, 3, 4, 5 };ArrayList nums2 = new ArrayList() { 1, 2, 3, 4, 5};Console.WriteLine(Sum(num1));Console.WriteLine(Avg(num1));Console.WriteLine(Sum(num2));Console.WriteLine(Avg(num2));}static int Sum(int[] nums){int sum = 0;foreach (int x in nums) {sum += x;}return sum;}static double Avg(int[] nums){int sum = 0;double count = 0;foreach(int x in nums){sum += x;count++;}return sum/count;}static int Sum(ArrayList nums){int sum = 0;foreach(var x in nums){sum += (int)x;}return sum;}static double Avg(ArrayList nums){int sum = 0;double count = 0;foreach(var x in nums){sum += (int)x;count++;}return sum/count;}
}
//使用了IEnumerable接口
class Program
{static void Main(string[] args){int[] nums1 = new int[] { 1, 2, 3, 4, 5 };ArrayList nums2 = new ArrayList() { 1, 2, 3, 4, 5};Console.WriteLine(Sum(nums1));Console.WriteLine(Avg(nums1));Console.WriteLine(Sum(nums2));Console.WriteLine(Avg(nums2));}static int Sum(IEnumerable nums){int sum = 0;foreach (int x in nums) {sum += x;}return sum;}static double Avg(IEnumerable nums){int sum = 0;double count = 0;foreach(int x in nums){sum += x;count++;}return sum/count;}}

二、依赖

在现实世界中,由于自身能力有限,合作是一个非常常见的行为,而面向对象是对现实世界的抽象,因此也存在着类与类、对象与对象的合作,即”依赖“。依赖的出现伴随着耦合,依赖越直接,耦合度越高。

class Program
{static void Main(string[] args){var user = new PhoneUser(new NokiaPhone());//var user = new PhoneUser(new EricssonPhone());超级无敌松耦合,只要改这里就能实现手机切换user.UsePhone();}}class PhoneUser
{private IPhone _phone;public PhoneUser(IPhone phone){_phone = phone;}public void UsePhone(){_phone.Dail();_phone.PickUp();_phone.Send();_phone.Receive();}
}interface IPhone
{void Dail();void PickUp();void Send();void Receive();
}class NokiaPhone:IPhone
{public void Dail(){Console.WriteLine("Nokia calling...");}public void PickUp(){Console.WriteLine("Hello!This is Tom");}public void Receive(){Console.WriteLine("Nokia message ring...");}public void Send(){Console.WriteLine("Hello!");}
}class EricssonPhone : IPhone
{public void Dail(){Console.WriteLine("Ericsson calling...");}public void PickUp(){Console.WriteLine("Hello!This is Tom");}public void Receive(){Console.WriteLine("Ericsson message ring...");}public void Send(){Console.WriteLine("Hello!");}
}

注意:在代码中如果有可以替换的地方,就一定有接口的存在,接口就是为了解耦/松耦合而生,他最大的好处就是可以让功能的提供方可以方便替换,减少紧耦合时提供方可能带来的风险。

  • 依赖反转原则

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/754402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【力扣hot100】49. 字母异位词分组

题目 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”,…

osgEarth学习笔记4-第一个OsgEarth QT程序

原文链接 使用QT Creator新建一个窗口项目。 编辑pro文件 QT core gui greaterThan(QT_MAJOR_VERSION, 4): QT widgets CONFIG c11 DEFINES QT_DEPRECATED_WARNINGS #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 # disables all the APIs deprecated bef…

前后端分离项目部署服务器教程--实践成功

文章目录 项目介绍流程1租界云服务2通过远程软件连接服务器3部署前后端代码停止功能文件 环境配置1.安装jdk2.安装Nginx3.安装mysql数据库 花了将近一天部署前后端的项目,写一个日志记录一下,话说孰能生巧。明天把服务器恢复初始在部署一下。 项目介绍 …

【已解决】在pycharm终端无法激活conda环境,但在cmd命令行中可以

一、问题描述 在windows下winr启动cmd命令行,可以成功运行conda命令并且激活环境在pycharm中打开Terminal终端,发现无法运行conda和pip命令,报错环境无法激活 无法在管道中间运行文档: D:\software\Anaconda3\condabin\conda.bat。 所在位置…

Matlab|基于改进粒子群算法的混合储能系统容量优化

目录 主要内容 部分程序 下载链接 主要内容 为了调高风光互补发电储能系统的经济性,减少其运行费用,研究风光互补发电储能系统的容量优化配置模型,探讨粒子群算法的改进及混合储能容量优化方法。首先通过对全生命周期费用静态模型…

全身动作捕捉设备Dreamscap X1,赋予影视、游戏动画全新创作体验

在影视动画、游戏动画制作领域,全身动作捕捉设备具有完整的动作捕捉性能捕获,无需关键帧动画技能,也可以捕捉真人全范围的运动姿态,通过全身动作捕捉设备系统将动作捕捉数据直接流式传输到3D模型上,辅助动画师制作出逼…

【DataWhale学习笔记-蝴蝶书共读】大语言模型背后

从图灵测试到ChatGPT 1950年,艾伦•图灵(Alan Turing)发表论文《计算机器与智能》( Computing Machinery and Intelligence),提出并尝试回答“机器能否思考”这一关键问题。在论文中,图灵提出了“模仿游戏”&#xff…

超越标签的探索:K-means与DBSCAN在数据分析中的新视角

最近在苦恼为我的数据决定分组问题,在查找资料时,恰好看到机器学习中的无监督学习的聚类分析,正好适用于我的问题,但是我之前学机器学习时。正好没有学习无监督部分,因为我认为绝大多数问题都是有标签的监督学习&#…

部署Zabbix Agents添加使能监测服务器_Windows平台_MSI/Archive模式

Windows平台 一、从MSI安装Windows代理,添加Windows Servers/PC 概述 可以从Windows MSI安装包(32位或64位) 安装Zabbix agent 32位包不能安装在64位Windows中 所有软件包都支持TLS,配置TLS可选 支持UI和命令行的安装。 1、下载Agent代理程序,使用Agent2升级版,官网链接如…

前端安全——最新:lodash原型漏洞从发现到修复全过程

人生的精彩就在于你永远不知道惊喜和意外谁先来,又是一个平平无奇的早晨,我收到了一份意外的惊喜——前端某项目出现lodash依赖原型污染漏洞。咋一听,很新奇。再仔细一看,呕吼,更加好奇了~然后就是了解和修补漏洞之旅。…

Java基础-泛型

泛型 基本概念为什么我们需要泛型泛型类型泛型类简单泛型类多元泛型类 泛型接口泛型方法为什么要使用泛型方法呢?使用方法 泛型的上下限上限下限加点难度的例子例子一例子二例子三 泛型数组深入理解泛型什么是泛型擦除后保留的原始类型泛型类型擦除原则如何进行擦除的?怎么证…

Linux课程四课---Linux第一个小程序(进度条)

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

从入门到精通:深入解析IO流之FileWriter类的使用技巧!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…

前端面试拼图-知识广度

摘要:最近,看了下慕课2周刷完n道面试题,记录并添加部分可参考的文档,如下... 1. 移动端H5 click有300ms延迟, 如何解决? 背景:double tap to zoom 移动端H5中的300ms点击延迟问题通常是由浏览…

从零开始学习在VUE3中使用canvas(三):font(字体)

一、简介 我们可以使用font在canvas中绘制文字,方式如下: const ctx canvas.getContext("2d"); // 绘制文字 ctx.font "24px 黑体, 宋体"; //字体大小 首选字体 备选字体 ctx.fillText("这里是显示的字的内容", 100, 50); //文字…

[QJS xmake] 非常简单地在Windows下编译QuickJS!

文章目录 前言准备C编译器xmake编译包 工程准备修改版本号第一遍编译第二遍编译效果 前言 quickjs是个很厉害的东西啊,我一直想编译一下的,奈何一直没成功。现在找了点时间成功编译了,写篇文章记录一下。当前版本:2024-1-13 应该…

OkHttp

文章目录 OkHttp概要1.简介2.特点3.基本组成5.工作流程 拦截器1.简介2.内置拦截器3.自定义拦截器 连接池1.简介2.常用参数配置选项 Dispatcher和线程池1.简介2.重要方法3.DispatCher中的双端队列4.总结 OkHttp 概要 1.简介 OkHttp是一个开源的HTTP客户端,用于在J…

留学文书可以彻底被AI取代吗?升学指导这一职业是否会被AI逼到墙角?

近日,ChatGPT再次“进化”,其最新版本ChatGPT-4又掀高潮。其生产者OpenAI 称,“ChatGPT-4是最先进的系统,能生产更安全和更有用的回复。”和上一代相比,GPT-4拥有了更广的知识面和更强的解决问题能力,在创意…

机器学习_聚类(k-means)

文章目录 聚类步骤k-means APIKmeans性能评估指标Kmeans性能评估指标API 聚类步骤 k-means通常被称为劳埃德算法,这在数据聚类中是最经典的,也是相对容易理解的模型。算法执行的过程分为4个阶段。 1.首先,随机设K个特征空间内的点作为初始的…

详细分析Mysql中的LOCATE函数(附Demo)

目录 1. 基本概念2. Demo3. 实战 1. 基本概念 LOCATE()函数在SQL中用于在字符串中查找子字符串的位置 它的一般语法如下: LOCATE(substring, string, start)LOCATE()函数返回子字符串在主字符串中第一次出现的位置 如果未找到子字符串,则返回0 具体的…