从C#8.0开始,也就是.net core3.0开始,您可以在C#的接口中编写方法体,以及静态方法。你发现了吗,这是不是很像在写类啊?
本示例编写是使用.net core3.0来写的。.net framework似乎不行,当然我也没有去深究到底行不行,自行研究吧。您实际编写代码时不宜使用中文。
如上图,在以前,我们如果在接口中,只能定义成员,是不可以像实现类一样编写方法体去写代码的。但从.net core3.0开始就可以了。
一、为什么要允许在接口中编写方法?
这个可能是由于前后端分离的发展,现在开发都流行这种模式。Webapi的应用,完全取代了以前的WebService、WCF、ASHX等方式,现在还在用这些方式的人,可能就略显得落伍了。
而WebApi一旦提供,可能不仅仅是给一个客户端调用,也还可能给N个客户端调用,典型的如卫星(故意打错字怕文章和谐)Api、捞宝网(故意打错字你懂的)Api,这些都被N多客户端调用。如果某Api更新,要提供新的功能,而该功能对于那些已经使用过的人来说,我们新增的方法,可以添加默认实现,这有助于更好的扩展接口。
二、举例子,老接口提供的功能
现在举个例子,用以说明老接口具备的功能。
例子描述:某年级有N个班级,这些班级要举行比赛,最终得出胜利者。代码如下:
1.先定义年级接口和年级类
2.然后定义班级接口和班级类
再定义一个班级类型的枚举
3.定义比赛类,本次比赛我们宣布命名为“毕昇杯”,什么奥林匹克,我大中华的神族,怎么可能用这么这种名字
4.现在客户端调用这些接口去举行一场比赛
5.程序运行结果
三、接口业务发布更新
上面的例子,某校作为客户端,调用了该接口api,举行了一场比赛。
但是像这样的学校不止一家,也就是说客户端不止一个。有很多学校,都会想要调用这个接口api去举行比赛。
现在我们作为api的服务提供商,要发布新版本,内容是给该api加上新的功能,但又不影响那些学校之前的调用。
新功能是:原有api只提供了哪个班级获胜,但不知道该班级的上位分。现在新版本提供上位分这个功能,并且有默认实现可供学校调用。
上位分:我儿子在上小学,我也才知道上位分的意思,就是指一个班级拆分成上中下三等学生。上位分取前10名的平均成绩,就是所谓的上位分。
四、编写新接口
如上图,我们给班级接口添加“上位分()”的方法,用于取得上位分。由于每个班级对自己的上位分定义不同,有些是取前10名,有些取前20名。所以,我们还要让这个方法能够操作人数。
那么我们就定义了一个静态字段和一个静态方法“Set上位分人数(int number)”,通过这个方法可以实现新需求。
另外,我们设置了默认的上位分取人数前10名,也就是说,调用我们api的客户,可以直接使用该方法得到上位分,这就是默认实现。
您注意到了吗?我们把这个接口interface当成普通的类来写了,既有静态方法又有成员方法,是不是跟普通的类一样啊?见过这么骚的写法吗?!
五、看一下新需求的使用
如上图红圈,是新接口更新后的用法,我们可以直接使用该接口调用静态方法,另外如果您要调用成员方法,需要强制转换为接口定义,才能调用,代码如下:
班级接口 grade = game.胜利班级;
如此,您强制转为“班级接口”这个类型后,就可以调用默认的成员方法了。
下面看一下接口更新后的输出:
很好,达成了我们接口添加了新需求的目的,并且不影响使用我们api的所有学校客户端,同时还给它们提供了默认实现,即自动取班级前10名为上位分。
六、新接口有什么好处?
嗯,其实,我倒不觉得有什么牛B之处。反而觉得这样子写法,类不成类,接口不像接口,不伦不类了。你要说为了给出默认实现吧,这似乎是一个理由。但是想用你这个新接口的客户端,自然自己会去实现。个人倒是没觉得好处明显在哪里,当然这可能是我眼光有限,学识不够的原因。
各位同学你们觉得呢?
祝您用餐愉快。