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

9月份的时候,微软宣布正式发布C#8.0,做为.NET Core 3.0发行版的一部分。C#8.0的新特性之一就是默认接口实现。在本文中,咱们将一块儿来聊聊默认接口实现。
做者:依乐祝
原文连接:http://www.javashuo.com/article/p-ufrubfpw-dc.htmlhtml

提早说下:编程

  1. 这其实是一种基于特性的编程技术,能够在几个无关类之间进行方法的重用。不过的确有点反认知,毕竟接口方法不能进行实现,已经深刻骨髓了。
  2. 必定要区分抽象类及接口的适用场景,抽象类表述的对象,而接口表述的是行为,以及规则哦
    固然大家也能够接口有多个实现类的时候可使用抽象类来包一层。而不是直接使用抽象类来定义行为哈。可能不少小伙伴直接使用抽象类来定义行为了!

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

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

若是该项目是一个小项目,那么咱们能够很容易地识别这些类,并在接口发生变化时进行相应的更改。可是,若是项目是大而复杂的,那么很难识别全部受影响的项目的模块和类。异步

咱们可能须要更多的资源和精力来识别和更改全部项目模块和类。除此以外,咱们可能须要重建和交付全部使用该接口的项目。ide

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

C#8.0容许咱们为接口中的方法指定默认实现。.net

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

咱们已经为图书处理建立了一个接口IBook。而后,假设咱们在IBook接口中声明了两个方法。code

请参阅下面的接口结构。

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);  
    }

而后,咱们须要在继承该接口的全部类中实现该方法。

不然,继承这个接口的类将引起错误,以下所示。

C# 8.0 - Default Interface Implementation - A New Feature Which Makes The Interface More Flexible

若是咱们为接口方法提供一个定义,咱们将获得如下错误。

C# 8.0 - Default Interface Implementation - A New Feature Which Makes The Interface More Flexible

即便咱们仅仅只是在一个模块或类中须要这个新方法,咱们也应该对使用这个接口的全部模块/类进行更改。

对于一个小应用程序来讲,这不会有太大的工做量。可是对于更大的应用程序来讲,在接口中进行更改可能会致使更多的问题,如应用程序失败、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);  
        }

输出以下。

C# 8.0 - Default Interface Implementation - A New Feature Which Makes The Interface More Flexible

因为咱们没有覆盖类中的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# 8.0 - Default Interface Implementation - A New Feature Which Makes The Interface More Flexible

这彷佛是一个有趣的特性,这将有助于咱们的架构重构工做,并使接口更加灵活。

快乐学习~~~~~

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

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

相关文章
相关标签/搜索