C# 实例解释面向对象编程中的接口隔离原则

在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原则的子集,在他2000年的论文《设计原则与设计模式》中首次提出。

SOLID 原则包含:

  • S:单一功能原则(single-responsibility principle)

  • O:开闭原则(open-closed principle)

  • L:里氏替换原则(Liskov substitution principle)

  • I:接口隔离原则(Interface segregation principle)

  • D:依赖反转原则(Dependency inversion principle)

本文我们来介绍接口隔离原则

接口隔离原则

接口隔离原则(Interface segregation principle,ISP)认为“多个特定用户接口要好于一个宽泛用途的接口”。

它指明用户(client)不应被迫使用对其而言无用的方法或功能。接口隔离原则将庞大臃肿的接口拆分成为更小、更具体的接口,让用户仅需知道他们感兴趣的方法。这种缩小了的接口也被称为角色接口(role interfaces)。接口隔离原则的目的是将系统解耦,从而使其易于重构、更改和重新部署。

C# 示例

§糟糕的示范

创建一个包含公司部门的 ICompanyDepartment 接口。

interface ICompanyDepartment
{public void AdminDepartment();public void FinanaceDepartment();public void HRDepartment();public void ITDepartment();
}

让我们首先为 A 公司实现 ICompanyDepartment 接口,文件名为 ACompany.cs

class ACompany : ICompanyDepartment
{public void AdminDepartment(){//DO SOMETHING}public void FinanaceDepartment(){//DO SOMETHING}public void HRDepartment(){//DO SOMETHING}public void ITDepartment(){//DO SOMETHING}
}

假如现在有一个从事制造业的 B 公司,他们没有 IT 部门,而多了一个生产部门,那么上面的实现就有问题了。

如果在接口 ICompanyDepartment 上添加一个 ManufacturingDepartment 生产部门,那我们就不得不在 ACompany 和 BCompany 两个类上都实现该签名。

也就是说,为了使用 ICompanyDepartment 接口,我们不得不在 ACompany 类上实现不必要的 ManufacturingDepartment 方法,在 BCompany 类上实现不必要的 ITDepartment 方法。这明显违反了接口隔离原则

为了使其符合接口隔离原则,我们需要进行一些修改。

§正确的示范

根据接口隔离原则,我们要将 ITDepartment 和 ManufacturingDepartment 方法从接口 ICompanyDepartment 拆分出来,形成两个独立的角色接口

  1. IACompanyUniqueFeature

  2. IBCompanyUniqueFeature

这样我们就拥有了三个接口:

interface ICompanyDepartment
{public void AdminDepartment();public void FinanaceDepartment();public void HRDepartment();
}
interface IACompanyUniqueFeature
{public void ITDepartment();
}
interface IBCompanyUniqueFeature
{public void ManufacturingDepartment();
}

类 ACompany 和 BCompany 的实现如下:

class ACompany : ICompanyDepartment, IACompanyUniqueFeature
{public void AdminDepartment(){//DO SOMETHING}public void FinanaceDepartment(){//DO SOMETHING}public void HRDepartment(){//DO SOMETHING}public void ITDepartment(){//DO SOMETHING}
}class BCompany : ICompanyDepartment, IBCompanyUniqueFeature
{public void AdminDepartment(){//DO SOMETHING}public void FinanaceDepartment(){//DO SOMETHING}public void HRDepartment(){//DO SOMETHING}public void ManufacturingDepartment(){//DO SOMETHING}
}

这样,以上的接口设计便遵循了接口隔离原则

总结

本文我介绍了 SOLID 原则中的接口隔离原则(Interface segregation principle),并通过 C# 代码示例简明地诠释了它的含意和实现,希望对您有所帮助。

作者 :技术译民
出品 :技术译站(https://ITTranslator.cn/)

参考文档:

  • https://en.wikipedia.org/wiki/SOLID

  • https://www.c-sharpcorner.com/blogs/interface-segregation-principle-in-c-sharp

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

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

相关文章

Appium同时运行多个设备

为了提高测试效率,测试需要同时在多个android设备上运行,就需要启动多个appium。 启动appium时,为每个设备设置不同的端口号,并为driver设置该设备的udid。见如下实例,关键是红色部分 DesiredCapabilities capabilitie…

AI作画的业界天花板被我找到了,AIGC模型揭秘 | 昆仑万维

一、前景 1、AI和AIGC的关系 人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 AIGC是继 UGC、PGC 之后新型利用AI技术自动生成内容的生产…

【ArcGIS微课1000例】0022:ArcGIS点(点坐标)自动连成线操作案例教程

ArcGIS中,可以将带三维坐标(X、Y、Z)的点/点集自动连成线,本文演示具体操作流程。 文章目录 实战演练GPS点数据下载实战演练 打开ArcMap软件,添加实验文件夹0022下的GPS轨迹点.shp矢量点数据(文末提供下载地址),该数据是由GPS RTK采集的河道点数据,首先需要将GPS点坐…

微信公众号 文章的爬虫系统

差不多俩个星期了吧,一直在调试关于微信公众号的文章爬虫系统,终于一切都好了,但是在这期间碰到了很多问题,今天就来回顾一下,总结一下,希望有用到的小伙伴可以学习学习。 1、做了俩次爬虫了,第…

[转]关于C#操作WPS和office兼容性的问题

最近一直在做的开发是关于导出word的功能,一开始的做法是在VS中直接添加引用office PIA,Microsoft.Office.Interop.Word,VS08有两个版本,V11和V12,V11对应的是office03,V12对应的office07,试验之…

AI入门到进阶到放弃

前些天,发现了一个比较好的AI学习网站,有很多数学基础,也通俗易懂,我自己先记录起来防止忘记,猛戳这里(学习网站)

OAuth认证与授权

什么是OAuth授权? 一、什么是OAuth协议OAuth(开放授权)是一个开放标准。允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息。而这种授权无需将用户提供用户名和密码提供给该第三方网站。OAuth允许用户提供一个令牌给第三方网站,一个…

IO的多路复用

一、概念: 使单线程或者单进程同时监测若干个文件描述符具有执行的能力; 二、作用: 类似于多进程和多线程 三、必要性: 多线程或者多进程对资源需求较高 四、IO模型: 1.阻塞io 不设置的话系统默认 2.非阻塞io 在阻塞io的基础上调整为不在阻塞状态 用到的函数接口…

C# 禁用 全局快捷键

本文经原作者授权以原创方式二次分享,欢迎转载、分享。原文作者:唐宋元明清原文地址:https://www.cnblogs.com/kybs0/p/12558056.htmlC# 禁用 全局快捷键给软件添加快捷键时,经常遇到其它软件或者系统已设置的快捷键,导…

SegmentFault Hackathon 文艺复兴

我有一个 idea,我想实现它,我正实现它,我已实现它。世界上存在一些好奇心旺盛、不爱墨守成规的人,略微偏执但又极度投入的他们崇尚自由,热衷用技术实现自己的想法,他们带着不羁的态度生活,利用编…

卧槽!VS Code 上竟然也能画流程图了???

作为一款开源的主流代码编辑器,VSCode 在发布之后一直受到不少开发者的喜爱。 此前,我们也曾在公众号上分享过多篇文章,向大家推荐了不少 VSCode 上比较实用(或沙雕)的插件。因此,有很多水友也经常调侃道&…

【QGIS入门实战精品教程】14.1:QGIS如何加载各种在线地图?

文章目录 一、XYZ Tiles连接方式二、插件添加三、WMS/WMTS/OWS连接方式一、XYZ Tiles连接方式 1. 加载OpenStreetMap QGIS默认可以加载OpenStreetMap地图。在左侧点击XYZ Tiles,默认下面有个OpenStreetMap选项,双击打右侧会显示地图,如下图所示: 在OpenStreetMap上右键→…

Oracle11g不能导出空表问题

ORACLE 11g 用exp命令导出库文件备份时,发现只能导出来一部分表而且不提示错误,之前找不到解决方案只能把没导出来的表重新建建立。后来发现是所有的空表都没有导出来。于是想好好查查,因为在以前的10g版本中没有这样的问题。查资料发现Oracle 11g中有个…

SkiaSharp 之 WPF 自绘时钟(案例版)

SkiaSharp是一个跨平台2D图形API,用于.NET平台,基于Googles Skia Graphics库(skia.org网站). 它提供了一个全面的2D API,可以跨移动、服务器和桌面模型来渲染图像。该图形库可实现获取指定坐标像素值、绘制2d图形、绘制文字(必须有…

推荐一简单易用的脑图制作工具

幕布是什么? 大纲文档工具,管理你的大脑层级折叠文字,结构化思考助手一键转换思维导图并编辑,效率翻倍幕布可以做什么? 大纲笔记,思维整理 学习笔记清单工具 管理日程管理待办购物清单等等内容创作会议记录…

自动性能统计信息(三)(Automatic Performance Statistics)

1.3 管理自动工作负载库(AWR)本节讲述如何管理AWR,包含以下主题: 管理快照 管理基线 管理基线模板 传输自动工作负载库数据 使用自动工作负载库视图 生成AWR报告 生成AWR对比报告 生成ASH报告 …

su: user tomcat does not exist

http://www.cnblogs.com/allegro/p/5005352.html 问题在于 你的startup.sh 里面设置了 用户,你需要修改为root或者tomcat用户 这是开发 迁移碰到的问题 test ".$TOMCAT_USER" . && TOMCAT_USERtomcat # Set JAVA_HOME to working JDK or JRE # JAVA_HOME/op…

【QGIS入门实战精品教程】4.5:QGIS打开Excel中的点坐标,并生成矢量文件

QGIS中可以很方便添加Excel或其他文本格式的点坐标,并将其转为矢量等多种格式的文件。 扩展阅读: 【ArcGIS风暴】ArcGIS 10.2导入Excel数据X、Y坐标(经纬度、平面坐标),生成Shapefile点数据图层 文章目录 1. 数据准备2. 添加数据3. 保存文矢量文件1. 数据准备 本实验使用…

[NOI2014]起床困难综合症

从高位往地位贪心即可 # include <bits/stdc.h> # define IL inline # define RG register # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; const int _(1e5 10);IL ll Read(){RG char c getchar(); RG ll x 0, z 1;for(;…

腾讯云EKS 上部署 eshopondapr

腾讯云容器服务&#xff08;Tencent Kubernetes Engine&#xff0c;TKE&#xff09;基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务。腾讯云容器服务完全兼容原生 kubernetes API &#xff0c;扩展了腾讯云的云硬盘、负载均衡等 kubernetes 插件&…