[译]C#8.0中一个使接口更加灵活的新特性-默认接口实现

9月份的时候,微软宣布正式发布C#8.0,作为.NET Core 3.0发行版的一部分。C#8.0的新特性之一就是默认接口实现。在本文中,我们将一起来聊聊默认接口实现。

众所周知,对现有应用程序的接口进行更改是一项很危险的操作。

如果这个接口又在多个项目中使用了,那么进行更改将需要付出更多的精力,以确保它不会在其他地方运行失败。

如果该项目是一个小项目,那么我们可以很容易地识别这些类,并在接口发生变化时进行相应的更改。但是,如果项目是大而复杂的,那么很难识别所有受影响的项目的模块和类。

我们可能需要更多的资源和精力来识别和更改所有项目模块和类。除此之外,我们可能需要重建和交付所有使用该接口的项目。

为了处理这种情况,Microsoft团队在C#8.0中引入了一个新特性--默认接口实现

C#8.0允许我们为接口中的方法指定默认实现。

下面让我们用一个例子来讨论这个问题。假设我们有一个图书馆管理的应用程序。

我们已经为图书处理创建了一个接口IBook。然后,假设我们在IBook接口中声明了两个方法。

请参阅下面的接口结构。

public interface IBook  {void AddBook(string bookName, string autherName);void removeBook(string bookName);}

然后,我们有多个类继承了这个接口,如下所示

public class Book : IBook
{public void AddBook(string bookName, string autherName)  {Console.WriteLine("Book {0} added!",bookName);}public void removeBook(string bookName)  {Console.WriteLine("Book {0} Removed!",bookName);}
}

在第一阶段完成之后,我们已经交付了应用程序。

在第二阶段,客户想要一个给书本进行评级的功能。

因此,我们可以在IBook接口中添加另一个方法,如下所示。

public interface IBook  {void AddBook(string bookName, string autherName);void removeBook(string bookName);void rateBook(int bookID);}

然后,我们需要在继承该接口的所有类中实现该方法。

否则,继承这个接口的类将引发错误,如下所示。

如果我们为接口方法提供一个定义,我们将得到以下错误。

即使我们仅仅只是在一个模块或类中需要这个新方法,我们也应该对使用这个接口的所有模块/类进行更改。

对于一个小应用程序来说,这不会有太大的工作量。但是对于更大的应用程序来说,在接口中进行更改可能会导致更多的问题,如应用程序失败、bug、构建和交付问题等等。

但是在C#8.0中Microsoft 团队通过引入默认接口实现特性为这种情况引入了一种简单的解决方案。

在C#8.0中,我们可以为接口成员定义默认定义。

请参阅下面的接口声明。

public interface IBook  
{void AddBook(string bookName, string autherName);void removeBook(string bookName);void rateBook(int bookID){//default logic hereConsole.WriteLine("\nExecuted the Default implementation in the interface");}
}

让我们从Main方法调用该方法,如下所示。

static void Main(string[] args)  {IBook ib = new Book();ib.AddBook("Wings of Fire","Dr.A.P.J Abdul Kalam");ib.removeBook("Belated Bachelor Party");ib.rateBook(1);}

输出如下。

由于我们没有覆盖类中的rateBook()方法,因此将执行接口中的默认实现。

但是,如果在类中重写此方法,类中的实现将被执行。

下面的代码中给出了这个方法的一个新的实现,如下所示。

public class Book : IBook{public void AddBook(string bookName, string autherName)  {Console.WriteLine("Book {0} added!", bookName);}public void removeBook(string bookName)  {Console.WriteLine("Book {0} Removed!", bookName);}public void rateBook(int bookID)  {Console.WriteLine("\nOverride : Executed the implementation in the class");}}

如果我们运行应用程序,我们将得到以下结果

这似乎是一个有趣的特性,这将有助于我们的架构重构工作,并使接口更加灵活。

快乐学习~~~~~

很久没写文章了,有点生疏了,接下来准备抽时间谢谢C#中的异步,聊聊我的理解~~~欢迎大家加入.net core两千人交流群637326624交流

原文:https://www.c-sharpcorner.com/article/working-with-default-interface-implementation-in-c-sharp-8-0/

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

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

相关文章

鲲鹏来了,在EulerOS试用.NETCore-3.1

在EulerOS试用.NETCore-3.1前言EulerOS其实出来有一段时间了,一直在关注,单是仅仅也只是停留在观望的阶段,目前还没有接入的打算;正好看到园子里的兄弟分享了华为云免费试用的活动后,难捺激动的心情,我马上…

如何在ASP.NET Core 中快速构建PDF文档

比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间。在本文中我们将要使用DinkToPD…

在VS2019发布独立程序与单一执行程序

背景随着.NET Core 3.1 LTS的发布,.NET Core 3.1 进入了3年的支持周期,在这期间使用.NET 的人数肯定会发生一个质的飞跃。01目标本次主要集中在使用.NET Core 3.1 WPF程序发布一个独立的单一执行程序。首先,新建一个wpf项目,名称为…

C#异步编程看这篇就够了

随着.NET Core的流行,相信你现在的代码中或多或少的会用到async以及await吧!毕竟已成标配。那么我们为什么要用async以及await呢?其实这是微软团队为我们提供的一个语法糖,让我们不用996就可以轻松的编写异步代码,并无…

2019 AI Bootcamp·Guangzhou 参会日记

2019年的全球AI训练营在北京、上海、广州、杭州、宁波五个地方同时举办!12月14日,微软全球AI Bootcamp活动再次驾临广州,本次会议结合 ML.NET 和基于 SciSharp 社区介绍最新的基于 .NET Core 人工智能技术,还有云端人工智能解决方…

AI Boot Camp 分享之 ML.NET 机器学习指南

今天在中国七城联动,全球134场的AI BootCamp胜利落幕,广州由卢建晖老师组织,我参与分享了一个主题《ML.NET 机器学习指南和Azure Kinect .NET SDK概要》,活动虽然只有短短的2天时间的宣传,报名70人,到场40多…

使用 Ocelot 匹配路由的方法匹配路由

使用 Ocelot 匹配路由的方法匹配路由Intro之前我们在 Ocelot 网关的基础上自定义了一个认证授权的 Ocelot 中间件,根据请求的路径和 Method 进行匹配,找到对应的权限配置,并判断是否可以拥有访问资源的角色,如果没有则返回 401/40…

【.NET Core 3.1】 策略授权中获取权限数据

▼更多精彩推荐,上午11点到达▼随着项目关注度渐渐升高,目前已经1.2k个star,我的内心反而更加的惶恐了起来,最近也是很有强迫症,只要有小伙伴反馈项目的问题,就很着急,哪怕一丁点的问题&#xf…

《Dotnet9》系列-开源C# Winform控件库1《HZHControls》强力推荐

大家好,我是Dotnet9小编,一个从事dotnet开发8年的程序员。我最近在写dotnet分享文章,希望能让更多人看到dotnet的发展,了解更多dotnet技术,帮助dotnet程序员应用dotnet技术更好的运用于工作和学习中去。文章阅读导航一…

不要叫我,我会叫你

之前看过前辈Artech关于控制反转的一篇文章,文章通俗易懂且言语精炼,写技术文章既是积累也是分享,既然是分享那么必须让读者能够明白到底讲解的什么,所以在这里我也挑战下自己,看看能不能将概念通过简洁代码和语言的形…

用.NET模拟天体运动

用.NET模拟天体运动这将是一篇罕见而偏极客的文章。我上大学时就见过一些模拟太阳系等天体运动的软件和网站,觉得非常酷炫,比如这个(http://www.astronoo.com/en/articles/positions-of-the-planets.html): 其酷炫之处…

01 手把手带你构建大规模分布式服务--高并发、高可用架构系列,高质量原创好文!...

作者:丁浪,目前在创业公司担任高级技术架构师。曾就职于阿里巴巴大文娱和蚂蚁金服。具有丰富的稳定性保障,全链路性能优化的经验。架构师社区特邀嘉宾!阅读本(系列)文章,你将会收获:…

如何正确的探索 Microsoft Ignite The Tour

Microsoft Ignite The Tour 是一年一度微软为全球开发者、IT专家、安全专家以及数据专家提供的为期两天,包含众多核心产品的实践性技术培训。2019.12.10-2019.12.11 已经在北京国家会议中心胜利闭幕,我作为一名Speaker 参与了两门课程的分享,…

回顾这一年,我沉默良久

今天是一个特殊的日子,因为还有一周就2024了。 回忆 我骑着我心爱的小电驴慢悠悠的走在下班的路上,看着万家灯火,匆匆而过的行人和那开着三轮车的摊贩们与城管斗智斗勇。 我陷入了回忆? 回忆着今年的进程,先是裁员…

使用ASP.NET Core 3.x 构建 RESTful API - 4.1 面向外部的Model

Entity Framework Core 使用的 Entity Model 是用来表示数据库里面的记录的。 而面向外部的 model 则表示了要传输的东西。这类 model 有时候叫做 Dto,有时候叫做 ViewModel。 举一个例子,人员的Entity Model如下: 最后一个字段表示人员的出生…

特意向大家推荐.NET技术圈一些优秀开发者的公众号

在互联网技术飞速发展的今天,各种技术席卷而来,总是让人感觉压力山大。作为.NET开发者,我们该如何刷新自己,实现价值的提升呢?2019年.NET中国开发者峰会之后,我们汇总了.NET技术圈一些优秀开发者的公众号&a…

ASP.NET Core on K8S深入学习(11)K8S网络知多少

Photo :Kubernetes文 | Edison Zhou本文已加入《.NET Core on K8S 学习与实践系列文章索引目录》,点击查看阅读更多容器化相关文章,希望对你有所帮助!Kubernetes网络模型我们都知道Kubernetes作为容器编排引擎,它有一个…

Amazon、Linux基金会开发边缘网络交换器操作系统

Amazon、Linux基金会和5家网络业者上周宣布边缘网络交换器操作系统项目DENT,可能冲击开发专属操作系统的网络晶片及设备业者。DENT希望集结网络设备制造商,系统整合商及晶片厂商,为分散式厂区、远端办公室、分公司及零售业开发解构式网络交换…

多库操作:多个数据库的动态切换(一)

▼更多精彩推荐,上午11点到达▼在平时的开发中,受到传统模式的影响,我们都是习惯了单一的数据库表操作,把数据都建到一个库里边,然后进行增删改查,这个是很经典的开发模式。但是随着项目开发,总…

超燃| 2019 中国.NET 开发者峰会视频发布

首届 .NET Conf China 2019 年,注定会是 .NET Core 社区发展的关键一年,诸多重大事件在这一年发生!正如大家所期待的那样,刷新中国 .NET 社区的年度盛会——2019 中国 .NET 开发者峰会(.NET Conf China 2019&#xff0…