axis1 c# 接口 调用_C# 8.0 的默认接口方法

例子

直接看例子

有这样一个接口:

dd3d8260f80ac58497f13c966431e844.png

然后有三个它的实现类:

00e2ced5d5b96bdd2522786ee70cc65a.png

然后在main方法里面调用:

fa203597f168fecfac032a8ae7191332.png

截至目前,程序都可以成功的编译和运行。

IPerson接口变更

突然,我想对所有的人类添加一个新的特性,例如,添加一个自我介绍的方法,所以我在IPerson里添加了Introduce()这个方法:

fa6b408533b6edf1d461e2bbf1f2c425.png

现在再次Build一下项目,肯定会失败的:

d974c39fd062e4cb08cee6a1c8b45227.png

因为这个方法在三个实现类里面都没有实现。

使用默认的实现来更新接口

如果在C# 8.0以前,我们肯定需要把三个实现类都实现一下这个Introduce() 方法。而在C# 8.0里,我们可以在IPerson接口里做一个默认的方法实现:

7073059163eda2a2906e05f30bd579ec.png

再次Build之后,您会发现就没有错误了:

0f2b0385da3264898584fd72fe253dbc.png

而且我们也可以在所有的实现类上正常的调用这个方法:

2bd1093d442b7037a05f9dbadc0dfd46.png
9c396be1e6a0a5c26e44db15e45cb9b9.png

我没有设置任何属性,但是结果是没问题的。

但是,不可以直接在实现类上调用该方法,例如这样写就会报错:

6bb73bfbb07991b869083579df90a237.png

这是因为Teacher这个实现类并没有定义Introduce()这个方法。

在前面的例子的里,我是通过IPerson接口调用的这个方法,这是没有问题的,因为IPerson这个接口定义了这个方法。

接口的静态成员

上面例子的输出是这样的:

9c396be1e6a0a5c26e44db15e45cb9b9.png

而我想让输出有默认的名字和年龄,在C# 8.0里面,我们可以这样做,添加静态字段(field)和静态方法:

2b11f8f594c3c63a66b8241203e90cce.png

实际上这个不会报错的,出现红色波浪线的原因可能是因为我的Resharper和VS没有升级,Build会成功的。

这里面我做的有点“脱裤子放屁”,但我仅仅是为了展示语言的新特性。

然后在调用的时候,我们可以在IPerson接口上先设置默认值:

050855e34d015f729765091478199a5f.png

然后运行:

fcf079a94bb72a169898865ecba0d631.png

可以看到,由于各个实现类都没有自己的实现,所以都输出了默认值。

在类上实现接口方法

在Teacher类上实现Introduce()这个方法:

0984aae6d4b6ed11b86c02604bc1bdb5.png

然后就可以调用Teacher上的Introduce()方法了:

b7b9a3d967fc7abaf2be3761a89c6fb8.png

运行程序:

6b6a346cebf7fa0704aafbb854edac9d.png

可以看到无论是通过Teacher类的实例还是通过IPerson接口,最终调用的都是Teacher类实现的Introduce()方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值