C# 8.0 默认接口实现

C# 8.0 默认接口实现

Intro

C# 8.0 开始引入了默认接口实现,也就是可以在接口里写方法实现。

在之前的版本中接口上是没有办法定义实现的,方法也都是 public 的,除了接口和属性之外是不能定义其他数据的,这也意味着,接口从一开始就要设计得比较好,否则在已有接口里增加新方法的时候其实现就必须要修改,否则就会编译失败,默认接口实现使得可以不造成破坏性变更的前提下在接口中新增加方法,只需要在接口中提供一个默认的实现即可。

Sample

下面我们来看一个示例吧:

internal interface IFly
{string Name { get; }
}
internal class Superman : IFly
{public string Name => nameof(Superman);
}
internal class MonkeyKing : IFly
{public string Name => nameof(MonkeyKing);
}

这是一个基本的接口定义,并提供了两个实现,紧接着我们来为接口新增一个方法,

internal interface IFly
{string Name { get; }void Fly() => Console.WriteLine($"{Name.GetValueOrDefault((DefaultName))} is flying");
}internal class Superman : IFly
{public string Name => nameof(Superman);public void Test(){((IFly) this).Fly();Console.WriteLine(Name);}
}internal class MonkeyKing : IFly
{public string Name => nameof(MonkeyKing);public void Fly(){Console.WriteLine($"I'm {Name}, I'm flying");}
}

我们在接口里增加了一个 Fly 方法,并提供了一个默认实现,在其中一个实现中进行了重写,我们来写一段代码测试一下吧

// Cannot resolve symbol 'Fly'
// new Superman().Fly();IFly fly = new Superman();
fly.Fly();fly = new MonkeyKing();
fly.Fly();

输出结果如下:

Superman is flying
I'm MonkeyKing, I'm flying
IFly

上面的示例中 Superman 没有定义 Fly 这个方法,是不能直接调用 Fly 方法的,需要先转成 IFly 接口然后再调用,此时方法实现是在接口里定义的逻辑,而 MonkeyKing 实现了 Fly 方法,所以会使用它自己的 Fly 实现,如上面所示。

除了上面的基本用法之外,现在可以在接口里定义静态字段静态方法来实现更好的方法复用,我们在上面的示例里演示一下,修改后的示例如下:

internal interface IFly
{private const string DefaultName = nameof(IFly);protected static string GetDefaultName() => DefaultName;public static string GetPublicName() => DefaultName;// Interface cannot contain instance fields// private string name = "";string Name { get; }void Fly() => Console.WriteLine($"{Name.GetValueOrDefault((DefaultName))} is flying");
}internal class MonkeyKing : IFly
{public string Name => nameof(MonkeyKing);public void Fly(){Console.WriteLine($"I'm {Name}, I'm flying, DefaultName:{IFly.GetDefaultName()}");}
}

如果定义了 protected static 的方法或字段,则在实现接口的类中就可以通过 IFly.GetDefaultName() 来调用接口中的方法了,如果是 protected 就只能在实现它的类型中使用,如果要在没有实现接口的类型中调用可以声明为 public 就可以了,下面是在没有实现接口的类型中调用的示例:

// Cannot access protected method 'GetDefaultName' here
// IFly.GetDefaultName().Dump();IFly.GetPublicName().Dump();

More

虽然现在可以这样用,但我个人还是推荐沿用之前的接口用法,不要轻易使用这个特性,提前设计提前规划才是正道,不要想着事后补偿,感觉这个特性比较合适的一个使用场景是现在基于接口的扩展方法,扩展方法作为一个接口的默认实现,具体类可以重写这个实现,使用示例如下:

Task<bool> SaveProperties(int id, Dictionary<string, object> properties)
{if (properties is null || properties.Count == 0) return Task.FromResult(false);var json = JsonConvert.SerializeObject(properties.Select(p => new PropertyModel(){PropertyName = p.Key,PropertyValue = p.Value?.ToString()}));return SaveProperties(id, json);
}Task<bool> SaveProperties(int id, string properties);

在之前的版本中,我一般都是把上面的方法作为一个扩展方法来用,有个默认接口实现之后也可以考虑加一个默认实现(仅限于业务代码中,针对类库代码,感觉还是越干净越好)

References

  • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/default-interface-methods-versions

  • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#default-interface-methods

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/DefaultInterfaceImplement.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

50款大数据分析神器 :你还在用Excel

全世界只有3.14 % 的人关注了数据与算法之美你平时用什么大数据分析工具&#xff1f;D3&#xff1f; R&#xff1f; 还是Processing&#xff1f;PS和计算器...只有你还在用excel&#xff01;工欲善其事&#xff0c;必先利其器&#xff01;一款好的工具可以让你事半功倍。大数据…

WEB安全测试软件

为什么80%的码农都做不了架构师&#xff1f;>>> 五种必会软件&#xff1a; SubSonic CodeSmith Professional 4.1 HttpWatch Professional IE Developer Toolbar Fiddler 是一个web调试代理。它能够记录所有客户端和服务器间的http请求&#xff0c;允许你监视&…

python区域增长算法_区域增长算法

嘿大家好。我真的很难搞清楚这个逻辑&#xff0c;希望你能帮我。在我继续之前&#xff0c;我只想告诉你&#xff0c;我是业余程序员&#xff0c;也是一个初学者&#xff0c;没有任何形式的正式计算机科学培训&#xff0c;所以请容忍我。&#xff1a;D另外&#xff0c;我使用的是…

P6砖家:对不起,我没.NET5高并发经验,我要跑路了!

“秒杀活动”“抢红包”“微博热搜”“12306抢票”“共享单车拉新”等都是高并发的典型业务场景&#xff0c;那么如何解决这些业务场景背后的难点问题呢&#xff1f;秒杀系统中&#xff0c;QPS达到10万/s时&#xff0c;如何定位并解决业务瓶颈&#xff1f;明星婚恋话题不断引爆…

孩子觉得数学难?那是底子没打好!

孩子觉得数学难&#xff1f;那是底子没打好&#xff01;&#xff08;北师大学前教育博士帮你一起塑造孩子的数学思维&#xff01;&#xff09;要说陪娃写作业这事儿的状态和成果&#xff0c;用一句诗词就能概括&#xff1a;我本将心向明月&#xff0c;奈何明月照沟渠。陪得好&a…

Android 读取meta-data元素的数据

在AndroidManifest.xml中&#xff0c;<meta-data>元素可以作为子元素&#xff0c;被包含在<activity>、<application> 、<service>和<receiver>元素中&#xff0c;但 不同的父元素&#xff0c;在应用时读取的方法也不同。 1 &#xff1a;在Activ…

python科学计算环境配置_ATLAS + NumPy + SciPy + Theano 的Python科学计算环境搭建

Theano是一个Python库&#xff0c;提供了定义、优化以及评估数学表达式的库&#xff0c;尤其适合处理高维数组。使用Theano能获得和C差不多的处理速度&#xff0c;并且当利用GPU进行计算时&#xff0c;效率要优于CPU上运行的C语言程序。利用Theano能快速验证各种算法模型。但是…

朋友圈有趣的灵魂都去哪了?这几个优质公号给你答案

全世界有3.14 % 的人已经关注了数据与算法之美又到每周限量推荐公众号的时间啦关注了那么多公众号&#xff0c;百无聊奈地看文章你是否觉得时间被浪费&#xff0c;生命被辜负了&#xff1f;在号的数量上做减法&#xff0c;质量上做加法接下来给大家推荐最近一直在阅读的几个优质…

Istio 1.10 发布及官网改版

本文译自 Istio 官方文档 [1]&#xff0c;有部分修改。北京时间 5 月 19 日&#xff0c;我们很高兴地宣布 Istio 1.10 的发布&#xff01;我们要特别感谢我们的发布经理 Sam Naser[2] 和 张之晗 [3]&#xff0c;以及整个测试和发布工作组在 1.10 中的工作。这是我们 2021 年的第…

CSS各属性表

1、CSS 背景属性&#xff08;Background&#xff09; 属性描述CSSbackground在一个声明中设置所有的背景属性。1background-attachment设置背景图像是否固定或者随着页面的其余部分滚动。1background-color设置元素的背景颜色。1background-image设置元素的背景图像。1backgrou…

java接口课程_用java定义一个接口,用于查询课程

定义一个类Stu&#xff0c;包括如下属性&#xff1a;学号、姓名、性别、专业、课程&#xff0c;实现以下方法&#xff1a;每个属性的获取和定义&#xff0c;要求至少包含一个构造函数。定义一个接口类&#xff0c;定义方法qcc()用来查询课程。编写一...定义一个类 Stu&#xff…

深入探讨编程到底需要知道多少数学知识

全世界只有3.14 % 的人关注了数据与算法之美这篇文章中我会深入探讨编程中所需要的数学知识。你可能已经都知道了。对于基本的编程&#xff0c;你需要知道下面的&#xff1a;加减乘除 — 实际上&#xff0c;电脑会帮你作加减乘除运算。你仅需要知道什么时候运用它们。模运算 —…

sql server和mysql的区别是什么

开源MySQL是一个开源关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff1b;而SQL Server不是开源的&#xff0c;是商业的。程序MySQL主要用C和C 编程语言编程。SQL Server主要用C 编程&#xff0c;但在C语言中也有一些部分。平台SQL Server仅支持Linux和Windows平台&am…

zabbix2.0安装与配置

一、zabbix服务端安装&#xff1a;官方下载&#xff1a;http://www.zabbix.com/download.php1.安装配置所需要软件(zabbix需要一个lamp环境)[rootlocalhost ~]# yum install httpd php php-devel php-gd php-bcmath php-mbstring mysql-devel mysql-serverphp-xml php-mysql gd…

sql java 创建数据库_java动态创建数据库(sql server)

public static void main(String[] args) {// TODO Auto-generated method stubString url "jdbc:jtds:sqlserver://127.0.0.1:1433;databaseNamebase_name;usersa;password pas";//sa身份连接Connection con null;Statement stmt null;//ResultSet rs null;bool…

BeetleX.FastHttpApi之控制器调度设计

为了可以更灵活地在Webapi应用服务中分配线程资源&#xff0c;BeetleX.FastHttpApi在线程调度上直接细化到Action级别&#xff1b;组件不仅可以精准控制每个Action的最大RPS限制&#xff0c;还能精细到控制使用多少线程资源来处理这些API的请求。接下来详细讲解组件针对这一块的…

Java类加载机制深度分析

为什么80%的码农都做不了架构师&#xff1f;>>> Java类加载机制 类加载是Java程序运行的第一步&#xff0c;研究类的加载有助于了解JVM执行过程&#xff0c;并指导开发者采取更有效的措施配合程序执行。研究类加载机制的第二个目的是让程序能动态的控制类加载&…

北大清华团队编写!200多个科学实验+视频,和爸爸一起在家做

自从2017年2月份教育部从小学一年级起将科学课列入必修课&#xff0c;学校、家长都意识到科学素养对于孩子成长的重要性。好多家长都跃跃欲试&#xff0c;想陪孩子把科学“玩”起来。可是具体到如何给孩子做科学启蒙&#xff0c;面对的问题还真不少&#xff1a;生活中有哪些科学…

java 枚举工厂_在Java中使用枚举工厂,最佳做法?

Java允许我们在Enum上嵌入数据和行为.我不想在Enum上直接实施一个工厂,因为我认为这不是它的作用.但是我可以把类的引用放在枚举上,并在外部工厂中引用对象.相对于传统的工厂模式,你最好的实现是什么&#xff1f;哪种解决方案在哪种情况下更好&#xff1f;现在,代码.在两种解决…

ASP.Net服务性能优化原则

理理Asp.net性能相关的问题及注意事项。以下这些内容&#xff0c;全部是经验之谈。如果你有别的建议&#xff0c;也可以从后台发给我。服务器性能问题&#xff0c;通常在数据少的时候不会显现&#xff0c;也无需太多关注。但一旦数据量大了&#xff0c;就会变成一个麻烦且必须处…