c#入门详解:接口详解

接口(interface)

抽象类中的抽象方法只规定了不能是 private 的,而接口中的“抽象方法”只能是 public 的。
这样的成员访问级别就决定了接口的本质:接口是服务消费者和服务提供者之间的契约。
既然是契约,那就必须是透明的,对双方都是可见的。
除了 public,abstract 的抽象方法还可以是 protected 和 internal,它们都不是给功能调用者准备的,各自有特定的可见目标。

接口即契约(contract)
契约使自由合作成为可能,所谓自由合作就是一份合同摆在这里,它即约束服务的使用者也约束服务的提供者。如果该契约的使用者和提供者有多个,它们之间还能自由组合

示例推导

重载

同一个方法名被用于定义多个方法,但这些方法具有不同的参数列表(参数的数量、类型或参数的修饰符如ref、out、params等)。
当调用一个方法时,编译器会根据提供的参数类型和数量来确定应该调用哪个版本的方法。

 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(Sum(nums2));}// 计算和:该Sum()只能计算int类型的数组和// 不能计算nums2的object类型,需要用重载,两个Sum()static int Sum(int[] nums){int sum = 0;foreach (var item in nums){               sum += item;}return sum;}static int Sum(ArrayList nums){int sum = 0;foreach (var item in nums){sum += (int)item; // 强制转换为 int 类型}return sum;}}

接口版

int 整型数组的基类是 Array,F12可知其实现了接口 IEnumerable
ArrayList 也实现了接口 IEnumerable ,都遵守契约 IEnumerable
两个方法只要求能被迭代即可,就可以把具体类型换成接口 IEnumerable

// 使用接口,只写一次方法即可
static int Sum(IEnumerable nums){int sum = 0;foreach (var item in nums){sum += (int)item; // 强制转换为 int 类型}return sum;}

依赖和耦合

现实中有分工、合作,面向对象是对现实的抽象,也有分工、合作。
在面向对象中,合作的专业术语叫“依赖”,依赖的同时就有了耦合,依赖越直接,耦合就越紧。

高内聚低耦合
内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内元素彼此之间结合的紧密程度的度量。若一个程序之间各元素之间(程序段之间)联系紧密,则内聚性就高(高内聚)。
耦合性:又称块间联系。指软件系统各模块之间相互紧密联系程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性就越差。相反其耦合性就越弱(低耦合)。

Car 和 Engine 的紧耦合示例

 class Car与Engine紧耦合{static void Main(string[] args){var engine = new Engine();Car car = new Car(engine);car.Run(3);Console.WriteLine(car.Speed);}class Engine{public int PRM { get; set; } // 设置属性“引擎转数”public void Work(int gas) // gas:汽油{this.PRM = 1000 * gas;}}class Car{// Car 类里有 Engine 类型的字段,它俩就是紧耦合了// Car 依赖于 Engineprivate Engine _engine;public int Speed { get; set; }// // 当创建一个新的 Car 对象时,必须为这个构造函数提供一个 Engine 对象。public Car(Engine engine) {_engine = engine;}public void Run(int gas){_engine.Work(gas);this.Speed = _engine.PRM / 100; // 速度}}}

紧耦合的问题:

  1. 基础类一旦出问题,上层类写得再好也没辙
  2. 程序调试时很难定位问题源头
  3. 基础类修改时,会影响写上层类的其他程序员的工作

所以程序开发中要尽量避免紧耦合,解决方法就是接口。
接口:

  1. 约束调用者只能调用接口中包含的方法
  2. 让调用者放心去调,不必关心方法怎么实现的、谁提供的
接口解耦示例

以老式手机举例,对用户来说他只关心手机可以接、打电话和收、发短信。
对于手机厂商,接口约束了他只要造的是手机,就必须可靠实现上面的四个功能。

用户如果丢了个手机,他只要再买个手机,不必关心是那个牌子的,肯定也包含这四个功能,上手就可以用。用术语来说就是“人和手机是解耦的”。

class Program{static void Main(string[] args){}class PhoneUser{private Iphone _iphone;public PhoneUser(Iphone iphone){_iphone = iphone;}public void UsePhone(){_iphone.Dail();_iphone.PickUp();}}interface Iphone{void Dail(); // 打void PickUp(); // 接}class HuaWeiPhone:Iphone{public void Dail(){Console.WriteLine("HuaWei is calling");}public void PickUp(){Console.WriteLine("Hello!This is HuaWei");}}class XiaoMiPhone:Iphone{public void Dail(){Console.WriteLine("XiaoMi is calling");}public void PickUp(){Console.WriteLine("Hello!This is XiaoMi");}}}
  • 没有用接口时,如果一个类坏了,你需要 Open 它再去修改,修改时可能产生难以预料的副作用。引入接口后,耦合度大幅降低,换手机只需要换个类名,就可以了。
  • 等学了反射后,连这里的一行代码都不需要改,只要在配置文件中修改一个名字即可。
  • 在代码中只要有可以替换的地方,就一定有接口的存在;接口就是为了解耦(松耦合)而生。
  • 松耦合最大的好处就是让功能的提供方变得可替换,从而降低紧耦合时“功能的提供方不可替换”带来的高风险和高成本。

高风险:功能提供方一旦出问题,依赖于它的功能都挂
高成本:如果功能提供方的程序员崩了,会导致功能使用方的整个团队工作受阻

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

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

相关文章

Message passing mechanism (消息传递机制)

objc_msgSend 是 Objective-C 运行时系统中的一个核心函数,用于实现消息传递机制。在 Objective-C 中,方法调用实际上是消息传递的过程,当你在代码中调用一个方法时,编译器会将其转换为 objc_msgSend 函数的调用。 objc_msgSend …

构建体育直播平台源码:深度解析数据分析模块的核心展示内容

在现代的体育直播平台中,数据分析展示已经成为不可或缺的一部分。如下参考借助“东莞梦幻网络科技”提供的体育直播源码,打造的平台,并通过表格形式为用户列出以下数据分析内容: 1、积分排名:反映了各支队伍在赛季中的…

WPF 委托

在WPF(Windows Presentation Foundation)中,委托是一种类型安全的函数指针,允许将方法作为参数传递给其他方法,或将方法作为回调方法存储在委托中。委托在WPF中常用于事件处理、数据绑定、命令以及异步编程。 以下是在…

做跨境电商一定要测评吗?

不管是做亚马逊还是虾皮、Lazada、ebay、沃尔玛、Ozon、Allegro、敦煌网、Jumia、Falabella、SHEIN、OnBuy、新蛋、Fnac、eMAG、ManoMano、Fruugo、速卖通、阿里国际、煤炉等跨境电商平台,测评都是成本最低且最有效的一种推广方式 并不是说做电商就一定要去测评&am…

护肤品成分大公开

在追求美丽的道路上,护肤品无疑是我们手中的重要武器。而在这众多护肤品中,胶原蛋白这一成分因其独特的功效和作用,受到了广泛的关注和喜爱。今天,就让我们一起走进胶原蛋白的世界,揭开它的神秘面纱。 一、胶原蛋白是什…

React实现在线预览word报告/本地选择报告预览

标题使用的核心技术点是docx-preview,读取到文件的File对象,用File去做文件展示,这里是才用将文件转base64字符串存储到localStorage中 在线预览word报告且包含word样式 下载需要使用的min.js文件进项目的public目录中(上zip已包…

shell 终端打印格式化日志 log::info

代码 logging.sh #!/bin/bash NC\033[0m RED\033[31m GREEN\033[32m YELLOW\033[33m BLUE\033[34mlog::err() {printf "[$(date %Y-%m-%dT%H:%M:%S.%2N%z)][${RED}ERROR${NC}] %b\n" "$" }log::info() {printf "[${GREEN}$(date %Y-%m-%dT%H:%M:%S.%…

VB.net实战(VSTO):Excel插件的安装与卸载

1. 安装 1.1编程环境:Visual Studio 2022 1.2创建新项目: 1.3 加入一行测试程序:MsgBox(“hello”),点击启动,确认可以弹窗 1.4 点击发布 1.5 找到安装程序,点击安装。打开Excel程…

有效的括号-力扣

栈适合用来解决匹配问题。 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false 第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以retur…

Keras深度学习框架实战(7):使用YOLOV8和KerasCV进行高效的图像物体识别

1、绪论 1.1 KerasCV简介 KerasCV是一个专注于计算机视觉任务的模块化组件库,基于Keras构建,可与TensorFlow、JAX或PyTorch等框架配合使用。 概念与定位: KerasCV是Keras API的水平扩展,提供了一系列新的第一方Keras对象&#x…

微信短视频怎么收藏?成都鼎茂宏升文化传媒公司

微信短视频怎么收藏?一文教你轻松掌握 随着微信功能的不断升级,微信短视频已经成为我们日常生活中不可或缺的一部分。无论是朋友分享的生活点滴,还是公众号推送的精彩内容,短视频都以其直观、生动的形式,吸引着我们的…

乡村振兴与脱贫攻坚相结合:巩固拓展脱贫攻坚成果,推动乡村全面振兴,建设更加美好的乡村生活

目录 一、引言 二、巩固拓展脱贫攻坚成果 1、精准施策,确保稳定脱贫 2、强化政策支持,巩固脱贫成果 3、激发内生动力,促进持续发展 三、推动乡村全面振兴 1、加快产业发展,增强乡村经济实力 2、推进乡村治理体系和治理能力…

【面试宝藏】Redis 常见面试题解析

Redis 常见面试题解析 1. 什么是 Redis? Redis 是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合。 2. Redis 的数据类型? Redis 支持以下数据…

使用tftpd更新开发板内核

我们升级内核可以通过原厂提供的升级软件来进行,比如瑞芯微的RKDevTool.exe,只不过这种方式必须通过指定的OTG升级口,还得借助按键进入loader模式后才可以。 其实还可以利用一些通用的工具来进行升级,比如tftpd工具。 下载地址p…

C++:栈(stack)、队列(queue)、优先级队列(priority_queue)

hello,各位小伙伴,本篇文章跟大家一起学习《C:栈(stack)和队列(queue)》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 文章目录 :map…

rust linux 交叉编译

比如在 x86 linux 上编译 riscv64 的程序,可以建一个最简单的 hello world 测试 x86 linux 需要安装gcc-riscv64-linux-gnu,rust要rustup target add riscv64gc-unknown-linux-gnu 在 rust 工程里创建.cargo/config.toml,内容为:…

MPLAB--读写MCU数据

空工程 Read –Programmer\Read –File\Export, –确定后选择文件位置 & 文件名 Program –File\Import…,选择烧录的文件*.hex –Programmer\Program

(有代码示例)Vue 或 JavaScript中使用全局通信的3种方式

在 Vue 或 JavaScript 应用中,可以使用以下库来实现全局事件通信: Vue.js 中的 EventBus: 在 Vue.js 中,可以使用 EventBus 来实现全局事件通信。EventBus 是一个 Vue 实例,用于在组件之间传递事件。你可以使用 $on、…

如何 Logrus IT 的质量评估门户帮助提升在线商店前端(案例研究)

在当今竞争激烈的电子商务环境中,一个运作良好的在线店面对商业成功至关重要。然而,确保目标受众获得积极的用户体验可能是一项挑战,尤其是在使用多种语言和平台时。Logrus IT的质量评估门户是一个强大的工具,可帮助企业简化内容和…

《python开发》cannot allocate memory in static TLS block-报错问题解决

阿丹: 今天在配置跑rasa训练的时候出现问题,找了国内论坛有解决的人,但是说的不明白。查阅了很多论坛之后发现了解决的方案。 https://github.com/keras-team/keras-tuner/issues/317 问题描述以及错误: 关键错误 :c…