.从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之处。反而觉得这样子写法,类不成类,接口不像接口,不伦不类了。你要说为了给出默认实现吧,这似乎是一个理由。但是想用你这个新接口的客户端,自然自己会去实现。个人倒是没觉得好处明显在哪里,当然这可能是我眼光有限,学识不够的原因。

各位同学你们觉得呢?

祝您用餐愉快。

相关推荐