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

作者:依乐祝

原文链接:https://www.cnblogs.com/yilezhu/p/12034584.html

提前说下:

  1. 这实际上是一种基于特性的编程技术,可以在几个无关类之间进行方法的重用。不过的确有点反认知,毕竟接口方法不能进行实现,已经深入骨髓了。
  2. 一定要区分抽象类及接口的适用场景,抽象类表述的对象,而接口表述的是行为,以及规则哦

    当然你们也可以接口有多个实现类的时候可以使用抽象类来包一层。而不是直接使用抽象类来定义行为哈。可能很多小伙伴直接使用抽象类来定义行为了!

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

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

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

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

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

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

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

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

请参阅下面的接口结构。

  1. public interface IBook
  2. {
  3. void AddBook(string bookName, string autherName);
  4. void removeBook(string bookName);
  5. }

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

  1. public class Book : IBook
  2. {
  3. public void AddBook(string bookName, string autherName)
  4. {
  5. Console.WriteLine("Book {0} added!",bookName);
  6. }
  7. public void removeBook(string bookName)
  8. {
  9. Console.WriteLine("Book {0} Removed!",bookName);
  10. }
  11. }

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

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

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

  1. public interface IBook
  2. {
  3. void AddBook(string bookName, string autherName);
  4. void removeBook(string bookName);
  5. void rateBook(int bookID);
  6. }

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

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

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

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

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

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

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

请参阅下面的接口声明。

  1. public interface IBook
  2. {
  3. void AddBook(string bookName, string autherName);
  4. void removeBook(string bookName);
  5. void rateBook(int bookID)
  6. {
  7. //default logic here
  8. Console.WriteLine("\nExecuted the Default implementation in the interface");
  9. }
  10. }

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

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

输出如下。

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

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

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

  1. public class Book : IBook
  2. {
  3. public void AddBook(string bookName, string autherName)
  4. {
  5. Console.WriteLine("Book {0} added!", bookName);
  6. }
  7. public void removeBook(string bookName)
  8. {
  9. Console.WriteLine("Book {0} Removed!", bookName);
  10. }
  11. public void rateBook(int bookID)
  12. {
  13. Console.WriteLine("\nOverride : Executed the implementation in the class");
  14. }
  15. }

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

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

快乐学习~~~~~

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

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

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

  1. 【广州.NET社区推荐】【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

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

  2. JDK1.8新特性——Collector接口和Collectors工具类

    JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...

  3. JDK1.8新特性(一): 接口的默认方法default

    前言 今天在学习mysql分区优化时,发现一个博客专家大神,对其发布的文章简单学习一下: 一:简介 我们通常所说的接口的作用是用于定义一套标准.约束.规范等,接口中的方法只声明方法的签名,不提供相应的 ...

  4. [译] C# 5.0 中的 Async 和 Await (整理中...)

    C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 V ...

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

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

  6. java8中接口default、static新特性,与抽象类区别

    之前Java接口中的方法默认都是public abstract,成员变量默认都是public static final,偶然发现接口中可以有default类型的方法,才知道java8中接口可以有自己的 ...

  7. 【Java8新特性】接口中的默认方法和静态方法,你都掌握了吗?

    写在前面 在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法.而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法 ...

  8. 【Java8新特性】- 接口中默认方法修饰为普通方法

    Java8新特性 - 接口中默认方法修饰为普通方法 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学 ...

  9. TypeScript 2.0候选版(RC)已出,哪些新特性值得我们关注?

    注:本文提及到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new features 作为一个Javascript的超集, Ty ...

随机推荐

  1. [UWP]为番茄钟应用设计一个平平无奇的状态按钮

    1. 为什么需要设计一个状态按钮 OnePomodoro应用里有个按钮用来控制计时器的启动/停止,本来这应该是一个包含"已启动"和"已停止"两种状态的按钮,但我 ...

  2. 8.3 NOIP 模拟12题解

    话说这次考试T1和T2是真的水,然而T1CE,T2TLE,T3CE 这不就是在侮辱我的智商啊!之前本机编译都是c++,以后要用c++11. 这次的T1就是一个大型找规律,我的规律都找出来了,但是竟然用 ...

  3. python入门三元运算

    三元运算又称三目运算,是对简单条件语句的简写: a = 1 b = 2 c = ' ' c = a  if  a > b  else b 在上面中首先判断a是否大于b如果为真则c = a,如果为 ...

  4. Redis实战--Jedis实现分布式锁

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 分布式 ...

  5. C# II: Class ViewModelBase and RelayCommand in MVVM

    好久不写WPF和MVVM,新建一个Project后,想起来ViewModelBase和RelayCommand没有.以下Code摘自MSDN上的Article:Patterns - WPF Apps ...

  6. vue项目iframe的传值问题

    前言 项目需要,我需要引入一个已经封装好的浏览器插件.插件只能以html的方式调用, 所以.我把插件的使用封装了一个html页面.vue项目则利用iframe的方式引入. 到这里我就遇到了一个问题,那 ...

  7. C#winfrom将XML数据保存读取删除

    //创建一个数据集,将其写入xml文件 string name = "1.xml"; System.Data.DataSet ds = new System.Data.DataSe ...

  8. 心里有点B树

    在说B树之前最好先看看2-3树, 2-3树是B树的一种特例, 什么B树, B树就是2-3树, 2-3-4 树 , 2-3-4-5... 树的统称, 而B+树又是B树的一种变形 性质: 什么是二节点, ...

  9. ubantu删除源码安装文件

    1.在安装目录下执行 make uninstall (如安装目录为/opt/software/opencv3.1.0/release) 2.删除系统相关文件 cd /usr sudo find . - ...

  10. Netflix 开源 Polynote:对标 Jupyter,一个笔记本运行多种语言

    谈到数据科学领域的开发工具,Jupyter 无疑是非常知名的一种.它具有灵活高效的特点,非常适合进行开发.调试.分享和教学.近日,Netflix(奈飞)居然也玩起了跨界,他们开源了一个名为 Polyn ...