例子

直接看例子

有这样一个接口:

然后有三个它的实现类:

然后在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()方法。

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

C# 8.0 的默认接口方法的更多相关文章

  1. Java8 新特性之默认接口方法

    摘要: 从java8开始,接口不只是一个只能声明方法的地方,我们还可以在声明方法时,给方法一个默认的实现,我们称之为默认接口方法,这样所有实现该接口的子类都可以持有该方法的默认实现. · 待定 一. ...

  2. C# 8: 默认接口方法

    翻译自 John Demetriou 2018年8月4日 的文章 <C# 8: Default Interface Methods>[1],补充了一些内容 C# 8 之前 今天我们来聊一聊 ...

  3. C# 8.0 中开启默认接口实现

    原文:C# 8.0 中开启默认接口实现 当你升级到 C# 8.0 和 .NET Core 3.0 之后,你就可以开始使用默认接口实现的功能了. 从现在开始,你可以在接口里面添加一些默认实现的成员,避免 ...

  4. C#8.0 中使用默认接口成员更新接口

    连载目录    [已更新最新开发文章,点击查看详细] 从 .NET Core 3.0 上的 C# 8.0 开始,可以在声明接口成员时定义实现. 最常见的方案是安全地将成员添加到已经由无数客户端发布并使 ...

  5. [译]C#8.0中一个使接口更加灵活的新特性-默认接口实现

    9月份的时候,微软宣布正式发布C#8.0,作为.NET Core 3.0发行版的一部分.C#8.0的新特性之一就是默认接口实现.在本文中,我们将一起来聊聊默认接口实现. 众所周知,对现有应用程序的接口 ...

  6. 30分钟入门Java8之默认方法和静态接口方法

    30分钟入门Java8之默认方法和静态接口方法 前言 上一篇文章30分钟入门Java8之lambda表达式,我们学习了lambda表达式.现在继续Java8新语言特性的学习,今天,我们要学习的是默认方 ...

  7. Java8之默认方法和静态接口方法

    前言 上一篇文章30分钟入门Java8之lambda表达式,我们学习了lambda表达式.现在继续Java8新语言特性的学习,今天,我们要学习的是默认方法和静态接口方法. 这一Java8的新语言特性, ...

  8. 编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

    前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理解的东西,有些地方可能理解的不太到位,还望指正. 建议1. ...

  9. 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析

    作者 : 韩曙亮 转载请著名出处 :  http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 ...

随机推荐

  1. java时间格式转换任意格式

    例如:20180918/120023转换成2018-09-18 12:00:23 //时间格式转换 public String getNomalTime(String oldTime){ String ...

  2. EL十一大内置对象

    这是一个内置对象可以直接拿来使用,不需要再去声明. 1.读取页面上下文: (1)pageContext对象: 获取URL和URI: <body> URI:${pageContext.req ...

  3. cat命令显示文件指定行

    cat filename | tail -n 100 显示文件最后100行 cat filename | head -n 100 显示文件前面100行 cat filename | tail -n + ...

  4. 你应该知道的简单易用的CSS技巧

    作为前端,在工作中难免会遇到关于排版的问题,以下是我整理的一些关于CSS的技巧,希望对你能有帮助. 1.每个单词的首字母大写 一般我们会用JS实现,其实CSS就可以实现. JS代码: var str ...

  5. BootstrapVue 安装指南

    BootstrapVue 是基于 Bootstrap v4 + Vue.js 的前端 UI 框架.BootstrapVue 作为学习 Vue.js 框架本身的入门框架,我认为是非常不错的.Bootst ...

  6. Nginx开启Gzip压缩提升页面加载速度

    1.在 nginx 的conf 目录下新建 gzip.conf 文件 #开启gzip压缩 gzip on; #设置允许压缩的页面最小字节数 gzip_min_length 1k; #申请4个单位为16 ...

  7. group by 如何合并字符串优化记?

    sqlserver 2005及以上版本 表(tb) id    value 1     aa 2     cc 3     bb 3     dd 4     aa 4     cc 4     dd ...

  8. SpringBootSecurity学习(22)前后端分离版之OAuth2.0自定义授权码

    使用JDBC维护授权码 前面的代码中,测试流程第一步都是获取授权码,然后再携带授权码去申请令牌,授权码示例如下: 产生的授权码默认是 6 位的,产生以后并没有做任何管理,可以说是一个临时性的授权码,o ...

  9. e课表项目第二次冲刺周期第五天

    昨天干了什么? 昨天,我们组商量了主界面的主要设计,然后我查找了相关的资料,将主界面改成了一个连接数据库,并将数据库中的数据进行显示.接着,又在网上搜了一些资料,为数据建立了一个布局,能够显示该数据的 ...

  10. .NET Core使用gRPC打造服务间通信基础设施

    一.什么是RPC rpc(远程过程调用)是一个古老而新颖的名词,他几乎与http协议同时或更早诞生,也是互联网数据传输过程中非常重要的传输机制. 利用这种传输机制,不同进程(或服务)间像调用本地进程中 ...