例子

直接看例子

有这样一个接口:

然后有三个它的实现类:

然后在main方法里面调用:

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

IPerson接口变更

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

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

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

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

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

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

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

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

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

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

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

接口的静态成员

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

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

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

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

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

然后运行:

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

在类上实现接口方法

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

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

运行程序:

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

更详细的文档请点击这里查看

最新文章

  1. Oracel EBS - Response
  2. 【原】mysql慢日志分析
  3. mac: vmware fusion中cent os启动假死的解决办法
  4. 【EM】C++代码实现
  5. Windows Phone自定义控件 ProgressRing
  6. BZOJ 1014: [JSOI2008]火星人prefix Splay+二分
  7. hdoj 1596 find the safest road
  8. 钣金的折弯成型工艺(Press Braking)
  9. @class的基本使用
  10. oracle 11g 报错记录
  11. [上传下载] C# ImageUpload图片上传类教程与源码下载 (转载)
  12. TCP连接的状态分析
  13. puppet证书重申
  14. 14-利用SVD简化数据
  15. 常用的sql server规范
  16. Linux命令pmap
  17. js工具库---Lodash
  18. php之print_r
  19. 【Linux】人脸识别的封装
  20. Java == ,equals 和 hashcode 的区别和联系(阿里面试)

热门文章

  1. ECSHOP完美解决Deprecated: preg_replace()报错的问题
  2. MYSQL增删改查添加外键
  3. 代码审计之XSS及修复
  4. Android Studio [Toast]
  5. 站内搜索(ELK)之数据表字典类型字段的索引思路
  6. windows下tomcat启动日志乱码
  7. java ThreadLocal使用
  8. 十大排序算法JavaScript实现总结
  9. 01、JDBC连接
  10. TreeMap剖析