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/bicheng/20151.shtml

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

相关文章

攻防实战 | 邮件高级威胁检测与自动化响应

历经三个月的时间,年度重磅直播节目Fortinet 2024年度“Demo季”近日终于迎来了备受瞩目的压轴大戏——Demo Day第三期,主题为《新邮件安全下的高级威胁检测与自动化响应》。继成功举办了前两期《企业网络中的多源威胁情报自动化整合与集成》和《应急响应…

【持久层】在Spring Boot中使用Hibernate和Gradle构建项目

Hibernate是一个广泛使用的Java持久化框架,它使得Java对象与关系数据库之间的映射变得简单高效。在Spring Boot应用中,结合Gradle构建工具,能够方便地集成和使用Hibernate。本文将简述如何在Spring Boot中使用Hibernate,并通过Gra…

Pycharm使用时的红色波浪线报错——形如‘break‘ outside loop

背景: 我在一个方法中,写了一个if判断,写了一个break,期望终止这个函数,编辑器出现报错 形如下图 视频版问题教程: Pycharm下出现波浪线报错,形如break outside loop 过程: 很奇…

IDEA一键启动多个微服务

我们在做微服务项目开发的时候,每次刚打开IDEA,就需要把各个服务一个个依次启动,特别是服务比较多时,逐个点击不仅麻烦还费时。下面来说一下如何一键启动多个微服务。 操作步骤 点击Edit Configurations 2.点击“”,…

【设计模式】JAVA Design Patterns——Facade(外观模式)

🔍目的 为一个子系统中的一系列接口提供一个统一的接口。外观定义了一个更高级别的接口以便子系统更容易使用。 🔍解释 真实世界例子 一个金矿是怎么工作的?“嗯,矿工下去然后挖金子!”你说。这是你所相信的因为你在使…

性价比为王,物流商怎么选择高效的国际物流管理平台

在全球化贸易日益繁荣的今天,国际物流行业作为链接国内商家和海外市场的重要桥梁,发挥着极其重要的作用。 然而,随着国际物流市场竞争的加剧,对物流商来说,也面临着成本管控和效率提升的双重挑战。今天我们会重点探讨…

解决 DataGrip 2024.1.3 连接 Tdengine 时timestamp字段显示时区不正确问题

设置中找到该设置,将原来的设置 yyyy-MM-dd HH:mm:ss 修改为: yyyy-MM-dd HH:mm:ss.SSS z 即可。 注意:只能修改第一个,修改后提示错误,但是查询数据时能成功格式化时间,修改第二个不生效,可能是 bug 具体格式见: Date…

DOS编程入门:探索基础、深入技巧与实战应用

DOS编程入门:探索基础、深入技巧与实战应用 DOS编程,作为计算机编程的基石之一,对于初学者来说,既是一种挑战,也是一次深入了解计算机底层运作的绝佳机会。本文将从四个方面、五个方面、六个方面和七个方面&#xff0…

Opera 浏览器与Google联手,推出由Gemini驱动的全新AI功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

JavaScript循环语句

JavaScript中的循环语句有三种:for循环、while循环和do...while循环。这些循环语句可以帮助我们重复执行一段代码,直到满足某个条件为止。 for循环: for循环是最常用的循环语句之一,它包含一个初始化表达式、一个条件表达式和一个…

富士摄像机X-H2S MOV格式化后重新写入后的恢复方法

X-H2S是富士数码的一款旗舰机型,支持4K/6K高清,视频编码为最新的HVC。下面我们来看下富士数码摄像机恢复案例。 故障存储:512G存储卡 Exfat文件系统 故障现象: 512G的卡误格式化后又进行了拍摄,卡使用了120G不到的空间,其它底…

【副业】12种程序员副业大汇总

1:写博客。技术能力可以的写技术文章输出,比如当前网站、掘金、阿里云社区、腾讯云社区、其他社区。 2:卖课程。大厂高P跟知识付费平台合作、录课卖课程、比如极课时间、慕课网、腾讯课堂。 3:写书。技术大拿出书,挣稿…

简述Vue中同时发送多个请求怎么操作?

在Vue中同时发送多个请求,我们通常使用axios这个库,因为它基于Promise,可以很好地处理异步操作。以下是两种常用的方法来同时发送多个请求: 方法一:使用Promise.all() 定义多个请求: 使用axios.get()或axi…

【EFK日志系统】docker一键部署kibana、es-head

docker一键部署kibana、es-head kibana部署es-head部署 上一篇文章搭建了es集群 规划服务器是 es01:172.23.165.185 es02:172.23.165.186 es03:172.23.165.187 那么kibana就搭建在主节点es01:172.23.165.185 按照顺序参考: docker一键部署EFK系统(elas…

使用 Vue 3 和 JsBarcode 开发一维码显示组件

在现代前端开发中,条形码(或称一维码)在许多应用场景中非常常见,例如商品管理、物流跟踪等。本文将介绍如何使用 Vue 3 和 JsBarcode 库来创建一个灵活的一维码显示组件,并展示如何在应用中使用它。 1. 安装必要的依赖…

简述Vue 的响应式原理中 Object.defineProperty 有什 么缺陷 ?

Vue.js 2.x 的响应式原理主要依赖于 Object.defineProperty 方法来实现数据劫持,即当数据发生变化时,能够触发视图更新。然而,Object.defineProperty 方法在 Vue 的响应式系统中存在一些缺陷: 无法监听数组的变化: Obj…

详解生成式人工智能的开发过程

回到机器学习的“古老”时代,在您可以使用大型语言模型(LLM)作为调优模型的基础之前,您基本上必须在所有数据上训练每个可能的机器学习模型,以找到最佳(或最不糟糕)的拟合。 开发生成式人工智能…

【linux】线程同步和生产消费者模型

线程同步 当我们多线程访问同一个临界资源时,会造成并发访问一个临界资源,使得临界资源数据不安全,我们引入了锁的概念,解决了临界资源访问不安全的情况,对于线程而言竞争锁的能力有强有弱,对于之前就抢到…

系统架构设计师【第9章】: 软件可靠性基础知识 (核心总结)

文章目录 9.1 软件可靠性基本概念9.1.1 软件可靠性定义9.1.2 软件可靠性的定量描述9.1.3 可靠性目标9.1.4 可靠性测试的意义9.1.5 广义的可靠性测试与狭义的可靠性测试 9.2 软件可靠性建模9.2.1 影响软件可靠性的因素9.2.2 软件可靠性的建模方法9.2.3 软件的可靠性模…

实物资产的市场主线将逐步回归

民生证券认为,投资者逐渐意识到长期趋势并没有发生变化,这或许正是本周最大的变化。在预期博弈重回冷静期后,去金融化背景下实物资源占优的市场主线也将逐步回归。 1 高低切换后的冷静期 从4月下旬至上周,A股市场呈现出由高位资产…