时间:2021-05-20
当你升级到 C# 8.0 和 .NET Core 3.0 之后,你就可以开始使用默认接口实现的功能了。
从现在开始,你可以在接口里面添加一些默认实现的成员,避免在接口中添加成员导致大量对此接口的实现崩溃。
最低要求
要写出并且正常使用接口的默认实现,你需要:
下载安装 Visual Studio 2019 Preview 版本
前往下载安装 Visual Studio Preview
开启 .NET Core 3.0 的支持
对于预览版的 Visual Studio 2019 来说,.NET Core 的预览版是默认打开且无法关闭的,所以不需要关心。
开启 C# 8.0 支持
请设置你项目的属性,修改 C# 语言版本为 8.0(对于预览版的语言来说,这是必要的):
或者直接修改你的项目文件,加上 LangVersion 属性的设置,设置为 8.0 。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <LangVersion>8.0</LangVersion> </PropertyGroup></Project>默认接口实现
以前的做法
比如,我们现在有下面这样一个简单的接口:
public interface IWalterlv{ void Print(string text);}这个接口被大量实现了。
现在,我们需要在接口中新增一个方法 DouBPrint ,其作用是对 Print 方法进行标准化,避免各种不同实现带来的标准差异。于是我们新增一个方法:
public interface IWalterlv { void Print(string text);++ void DouBPrint(string text); }然而我们都知道,这样的修改是破坏性的:
默认接口实现
那么现在,我们可以这样来新增此方法:
public interface IWalterlv { void Print(string text); -- void DouBPrint(string text);++ public void DouBPrint(string text) => Print($"Walterlv 逗比 {text}"); }在使用此方法来定义此接口中的方法后,那些没来得及实现此方法的类型也可以编译通过并获得标准化的实现。
class Program{ static void Main(string[] args) { IWalterlv walterlv = new Foo(); walterlv.DouBPrint("walterlv"); }}public class Foo : IWalterlv{ public void Print(string text) { }}当然,对于 Foo 类型来说,实现也是可以的:
public class Foo : IWalterlv{ public void Print(string text) { } public void DouBPrint(string text) => Print($"Walterlv 逗比 {text}");}静态字段和方法
除此之外,在接口中还可以编写静态字段和静态方法,这可以用来统一接口中的一些默认实现。
意味着,如果类没有实现接口中带有默认实现的方法,那么具有默认的实现;而如果类中打算实现接口中的带有默认实现的方法,那么也可以调用接口中的静态方法来进行实现。
public interface IWalterlv { void Print(string text);-- public void DouBPrint(string text) => Print($"Walterlv 逗比 {text}");++ public void DouBPrint(string text) => DefaultDouBPrint(this, text);++++ private static readonly string _name = "walterlv";++++ protected static void DefaultDouBPrint(IWalterlv walterlv, string text)++ => walterlv.Print($"{_name} 逗比 {text}"); }然后,对于实现方,则需要使用接口名来调用接口中的静态成员:
public class Foo : IWalterlv { public void Print(string text) { }-- public void DouBPrint(string text) => Print($"Walterlv 逗比 {text}");++ public void DouBPrint(string text)++ {++ // Do Other things.++ IWalterlv.DefaultDouBPrint(this, text);++ }++ }参考资料
Default implementations in interfaces - .NET Blog
Visual Studio 2019 version 16.1 Preview 3 - The Visual Studio Blog
Safely update interfaces using default interface members in C# - Microsoft Docs
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言最近VS2019正式版发布了,装下来顺便试用了一下C#8.0,最大的看点应该就是可空引用类型了。不过C#8.0仍然处于Beta的状态,而且试用时也遇到了几个
本文实例讲述了C#接口实现方法。分享给大家供大家参考。具体如下:在讲解C#实现接口的实例解析之前我们来看看C#接口的定义,如果一个类派生于一个接口,它就会执行某
本文实例讲述了JavaScript接口实现方法。分享给大家供大家参考,具体如下:JavaScript中实现接口的方法有三种:第一种,使用注释的方法实现接口特点:
java中的interface接口实例详解接口:Java接口是一些方法表征的集合,但是却不会在接口里实现具体的方法。java接口的特点如下:1、java接口不能
前言在Java中调用某个方法时,如果该方法的参数是一个接口类型,除了可以传入一个参数接口实现类,还可以使用匿名内部类实现接口来作为该方法的参数。匿名内部类其实就