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/

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

  1. java 接口的静态方法_Java8新特性:接口的默认方法与接口的静态方法

    默认方法允许接口方法定义默认实现,子类方法不必须实现此方法而就可以拥有该方法及实现.如下: public interface DefaultFuncInter { int getInt(); defa ...

  2. JDK8中的新特性——函数式接口

    JDK8 简介 概述 Java 8由Oracle从2014年3月18日发布,此版本是自Java 5(发布于2004年)之后的一个重量级版本,也是java发展史上的一个里程碑式的版本.这个版本在JVM. ...

  3. [WCF 4.0新特性] 默认终结点

    很多WCF的初学者是从之前的Web服务上转移过来的,他们非常怀念.asmx Web服务无配置的服务寄宿方式.你只需要在定义Web服务的时候再表示服务操作的方法上应用WebMethodAttribute ...

  4. Redis 5.0 正式版发布了,19 个新特性

    转载自  Redis 5.0 正式版发布了,19 个新特性 Redis 5.0 GA 正式版发布了! 下载地址: download.redis.io/releases/redis-5.0.0.tar. ...

  5. 【译】Visual Studio 2019 中 WPF UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

  6. Flink 1.11.0 发布,有哪些值得关注的新特性?

    简介:7 月 7 日,Flink 1.11.0 正式发布.历时近 4 个月,Flink 在生态.易用性.生产可用性.稳定性等方面都进行了增强和改善.Apache Flink PMC.阿里巴巴高级技术专 ...

  7. 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类

    1.Lambda表达式 用匿名内部类的方法去创建多线程1.new Thread2.参数传递new Runnable3.重写run方法4.在run方法中去设置线程任务5.调用start问题:我们最终目标 ...

  8. Unity2020.2中支持的C#8有什么新特性?

    洪流学堂,让你快人几步.你好,我是你的技术探路者郑洪智,你可以叫我大智. C# 8.0 向 C# 语言添加了以下功能和增强功能: Readonly 成员 默认接口方法 模式匹配增强功能: Switch ...

  9. lsdyna如何设置set中的node_list_如何快速掌握es6+新特性及核心语法?

    国庆刚刚结束,我们开始一波新的学习进程吧. ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.作为前端必备技能,我们来快速开始吧 接 ...

最新文章

  1. JavaEE框架整合之基于注解的SSH整合
  2. SAP MM 如何得到委外加工采购订单中需要发给subcontractor的物料的信息?
  3. QT利用QCustomplot绘制折线图海底声速梯度图,解决一条曲线中一个X值对应两个Y值
  4. TAppEncoder的main函数
  5. Griview中的删除按钮添加“确认提示”
  6. php中用for循环制作矩形,PHP中for循环语句的几种变型
  7. linux下ip协议(V4)的实现(三)
  8. jquery中的each不能结束外层的function
  9. it行业中sa与ba的区别_在钢铁行业中除尘器有什么区别?
  10. 学习language C
  11. SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 4)
  12. java做万年历,Java做的万年历
  13. 2013总结之“酒肉穿肠过,佛在心中坐”
  14. 计算机硬盘密码,电脑常识之--如何给移动硬盘[硬盘]加密码
  15. pandas最快入门(一)-读取与数据结构
  16. 冒泡排序 - 数据结构和算法88
  17. QT笔记——Qt动态属性 之 unpolish() 和 polish()
  18. 利用因果图法对一个自动饮料售货机软件进行黑盒测试
  19. 乐高打印机robotc
  20. 微软内部泄露的 XP的KEY和无限次激活码

热门文章

  1. 关于input type=file 限制文件上传类型
  2. PHP开发学习-Apache+PHP+MySQL环境搭建
  3. 自定义控件复选框和单选框的实现
  4. vue使用process.env搭建自定义运行环境
  5. mysql密码正确却提示错误, 不输入密码反而能登录
  6. oneproxy检测主从复制同步延迟
  7. “爱思助手”曝为iOS木马:可绕过苹果DRM机制
  8. jQuery07源码 (3803 , 4299) attr() prop() val() addClass()等 : 对元素属性的操作
  9. 陈松松:如何锁定细分领域,视频营销才更容易持续做下去
  10. 应用环境下的TIME_WAIT和CLOSE_WAIT