【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”,…

Visual Studio工程升级QT产生的问题及解决

文章目录 小结问题及解决QT的路径问题0xC0000139: Entry Point Not Found 参考 小结 最近将QT从版本5.3.2升级到了5.12.7,经及将VS2012工程升级到VS2015,碰到了一些问题,例如路径问题,程序无法启动的问题(Entry Point…

k8s client-java创建pod常见问题

1.配置Kubernetes连接: 使用Kubernetes的配置文件(通常位于~/.kube/config)或直接使用API服务器地址、认证信息等来配置客户端。 配置通常有两种模式,安全和不安全的配置模式,对认证要求严格就选用安全模式&#xff…

实景剧本杀小程序儿童公园剧本杀小程序系统开发

开发实景剧本杀小程序儿童公园剧本杀系统需要考虑以下几个方面: 1. 游戏设计:设计适合儿童玩耍的剧本杀游戏,考虑场景、角色、任务、线索等因素,以适应儿童的理解力和参与度。 2. 技术实现:利用小程序技术框架进行系…

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数据库 花了将近一天部署前后端的项目,写一个日志记录一下,话说孰能生巧。明天把服务器恢复初始在部署一下。 项目介绍 …

网络安全防御策略

网络安全防御策略 引言 在这个数字化的世界里,网络安全是每个个人和组织都需要关注的重要议题。了解如何保护自己免受网络攻击是至关重要的。 保持软件更新 重要性 防止已知漏洞被利用减少恶意软件感染的风险 操作建议 定期检查操作系统和应用程序的更新启用…

大模型-Prompt

一、prompt是什么 在大型语言模型集成中,"prompt" 是指您向模型提供的输入文本或指令,以引导模型生成特定类型的响应。这个 prompt 可以是一个问题、一段描述、一个任务说明,甚至是一部分对话历史记录等。通过设计和优化 prompt&a…

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

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

fedora RTL8821CE 无线网卡驱动安装

更新 fedora38 后,demsg 中会报大量的日志: rtw_8821ce 0000:02:00.0: unhandled firmware c2h interrupt如果遇到上面的信息,需要更新无线网卡驱动,方法参考: https://github.com/tomaspinho/rtl8821ce 1. 安装编译工具及依赖 sudo dnf i…

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基础-泛型

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

鸿蒙开发中闭包的使用

闭包的使用要分成三个部分,闭包的声明,闭包的实现,闭包的调用 第一中写法 闭包的声名 callSurfaceId:(surfaceid: string) >void (surfaceid:string) > {}闭包的实现 VideoDetail({ screenHeight: this.videoHeight, avPlayerUtil: …

汽车超级充电桩

在2023国际数字能源展主论坛上,深圳官宣建设“超充之城”,提出到2025年,深圳市将建设超充站300座,“超充/加油”数量比在国内率先达到1:1;2030年,超充站将增至1000座,完成超充骨干网建设&#x…

理论学习:使用early stopping解决神经网络过拟合问题,early stopping是什么?

Early stopping 是一种用来防止神经网络过拟合的正则化技术,其核心思想非常直接:在训练过程中定期检查模型在一个或多个验证集上的性能,并在性能不再显著提升时停止训练。这种方法既简单又有效,因为它利用了一个观察:训…