专栏首页依乐祝[译]C#8.0中一个使接口更加灵活的新特性-默认接口实现

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

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接口中声明了两个方法。

请参阅下面的接口结构。

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 here  
        Console.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/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是...

    依乐祝
  • [译]ASP.NET Core中使用MediatR实现命令和中介者模式

    在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁。因此,我们将通...

    依乐祝
  • .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    为什么写这篇文章呢?因为.NET Core的生态越来越好了!之前玩转.net的时候操作Redis相信大伙都使用过一些组件,但都有一些缺点,如ServiceSta...

    依乐祝
  • Java 代理模式应用

    代理模式是一种效率非常高的模式,其定义如下:提供一种代理以控制对这个对象的访问。 代理模式也叫委托模式,它是一项基本设计技巧。许多其他的设计模式,如状态模...

    用户5166556
  • android使用LruCache对listview加载图片时候优化处理

    注意:LruCache是有版本限制的,低版本的sdk需要在libs文件夹添加相应的support-4v文件。 本文改造的大部分是参考http://www.i...

    xiangzhihong
  • JAVA虚拟机关闭钩子(Shutdown Hook)

    当你认真的去看一个组件的源码的时候,你会经常看见这种关闭钩子的函数,如果你不了解的话,谷歌一下,你就会发现如下文章就是搜索引擎出来的第一篇,不愧是出自我们优秀的...

    zhisheng
  • Android自定义GLSurfaceView

    当我们需要把同一个场景渲染到不同的Surface上时,此时系统GLSurfaceView 就不能满足需求了,所以我们需要自己创建EGL环境来实现渲染操作。 注意...

    曾大稳
  • C# 事件(Event)

    事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。事件是用...

    庞小明
  • Java 多线程编程(上)

    https://blog.csdn.net/weixin_44510615/article/details/102617286

    润森
  • java | 什么是动态代理?

    最近在复习 Java 相关,回顾了下代理模式。代理模式在 Java 领域很多地方都有应用,它分为静态代理和动态代理,其中 Spring AOP 就是动态代理的典...

    一个优秀的废人

作者介绍

依乐祝

安徽容知日新科技股份有限公司高级软件开发工程师

安徽容知日新科技股份有限公司 · 高级软件开发工程师 (已认证)

精选专题

活动推荐

扫码关注云+社区

领取腾讯云代金券