C# 8.0 的默认接口方法

例子

直接看例子

有这样一个接口: 

640?wx_fmt=png

 

然后有三个它的实现类: 

640?wx_fmt=png

 

然后在main方法里面调用: 

640?wx_fmt=png

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

 

IPerson接口变更 

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

640?wx_fmt=png

 

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

640?wx_fmt=png

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

 

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

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

640?wx_fmt=png

 

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

640?wx_fmt=png

 

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

640?wx_fmt=png

 

640?wx_fmt=png

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

 

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

640?wx_fmt=png

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

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

 

接口的静态成员 

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

640?wx_fmt=png

 

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

640?wx_fmt=png

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

 

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

 

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

640?wx_fmt=png

 

然后运行: 

640?wx_fmt=png

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

 

在类上实现接口方法 

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

640?wx_fmt=png

 

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

640?wx_fmt=png

 

运行程序: 

640?wx_fmt=png

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

详细介绍请点击原文链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

convolutional layer 源代码

http://blog.csdn.net/xizero00/article/details/51049858 一、 卷积层的作用简介 卷积层是深度神经网络中的一个重要的层,该层实现了局部感受野,通过这种局部感受野,可以有效地降低参数的数目。我们将结合caffe来讲解具体是如何实现卷积层的…

在.net core3.0中使用SignalR实现实时通信

最近用.net core3.0重构网站,老大想做个站内信功能,就是有些耗时的后台任务的结果需要推送给用户。一开始我想简单点,客户端每隔1分钟调用一下我的接口,看看是不是有新消息,有的话就告诉用户有新推送,但老大…

活动最后72小时:购书优惠劵,折后再折,赶紧来抢啊

1024程序员节当当网计算机图书每满100减50!满200减100!满300-150!机械工业出版社华章公司联合当当网特意为【DotNET技术圈】用户申请了一批可与满减叠加使用的“满200减30”的图书优惠码,优惠码使用后相当于:400减230 …

ubuntu指令模式修改IP等信息

http://blog.igevin.info/posts/ubuntu-1404-ip-dns/ 先安装vim,然后按a启动编辑,两次按大写的Z结束编辑并保存。 修改/etc/network/interfaces设置静态IP sudo vi /etc/network/interfaces用下面的代码替换有关eth0的内容: # The primary…

C# 8 新特性 - using 声明

using语句块 尽管.NET Core运行时有垃圾收集器(GC)来负责内存清理工作,但是我们还是要自己确保当非托管资源不再使用的时候应该被清理掉。以前针对实现了IDisposable接口的对象,我们经常会使用using 语句块来这样做: 这…

Ubuntu failed to fetch ... hash sum mismatch

http://askubuntu.com/questions/41605/trouble-downloading-packages-list-due-to-a-hash-sum-mismatch-error Just remove all the content of /var/lib/apt/lists directory: sudo rm -rf /var/lib/apt/lists/*then run: sudo apt-get update

.Net Core3.0依赖注入DI

构建ASP.NET Core应用程序的时候,依赖注入已成为了.NET Core的核心,这篇文章,我们理一理依赖注入的使用方法。不使用依赖注入首先,我们创建一个ASP.NET Core Mvc项目,定义个表达的爱服务接口,中国小伙类实现…

.Net轻量状态机Stateless

很多业务系统开发中,不可避免的会出现状态变化,通常采用的情形可能是使用工作流去完成,但是对于简单场景下,用工作流有点大财小用感觉,比如订单业务中,订单状态的变更,涉及到的状态量不是很多&a…

运行Deeplab遇到‘Unexpected label’

https://groups.google.com/forum/#!topic/caffe-users/CLF4IZ2Tkqk This problem lies in the reading of *.png image(opencv auto insert filtered the pngs edge) So we can just change all the label *.png image to *.bmp format, then all gone right.

Asp.net Core全局异常监控和记录日志

前言系统异常监控可以说是重中之重,系统不可能一直运行良好,开发和运维也不可能24小时盯着系统,系统抛异常后我们应当在第一时间收到异常信息。在Asp.net Core里我使用拦截器和中间件两种方式来监控异常。全局异常监控的数据最好还是写入数据…

Deeplab 在Qt Creator下编译报错undefined reference to Mat_xxx

https://github.com/TheLegendAli/DeepLab-Context/issues/8 1. 修改工程根目录下的CMakeLists.txt 末尾加上 find_package(MATIO REQUIRED) include_directories(${MATIO_INCLUDE_DIR}) 2. 修改src/caffe/CMakeLists.txt target_link_libraries(caffe proto...) 中加…

在.Net Core 3.0中尝试新的System.Text.Json API

.NET Core 3.0提供了一个名为System.Text.Json的全新命名空间,它支持reader/writer,文档对象模型(DOM)和序列化程序。在此博客文章中,我将介绍它如何工作以及如何使用。 获取JSON库 如果以.NET Core为目标,请安装.NET …

caffe blob操作

http://blog.luoyetx.com/2015/10/reading-caffe-2/ Blob 在 Caffe 中扮演了重要的角色,用于存储数据和网络参数,同时也在 CPU 和 GPU 之间做了数据同步。Blob 原本在 Caffe 中被表示为一个 4 维数组 (num x channel x height x width),现在可…

extern __shared__

http://blog.csdn.net/openhero/article/details/3890578 首先是讲一下shared的memory的两种使用方法,然后讲解一下shared memory的bank conflict的问题,这个是shared memory访问能否高效的问题所在; Shared memory的常规使用:…

SiteServer CMS 新版本 V6.13(2019年11月1日发布)

欢迎来到 SiteServer CMS V6.13 版本,经过两个月的连续迭代开发,V6.13版本新增了几项重要功能,我们希望你会喜欢,一些关键的亮点包括:。新增功能及BUG 修复经过两个月的连续迭代开发,V6.13 版本新增了部分功…

CUDA的global内存访问的问题

http://blog.csdn.net/OpenHero/article/details/3520578 关于CUDA的global内存访问的问题,怎么是访问的冲突,怎样才能更好的访问内存,达到更高的速度。下面先看几张图,这些图都是CUDA编程手册上的图,然后分别对这些…

C# 8 新特性 - 异步流 Asynchronous Streams

异步流 Asynchronous Streams例子 这是一个很简单的控制台程序。它有一个NumberFactory&#xff0c;它可以根据传递的参数来产生一串数字&#xff08;IEnumerable<int>&#xff09;。然后在这个程序中把每个数字都打印出来&#xff0c;同时在前边显示出当前的线程ID。 这…

__syncthreads()

http://www.cnblogs.com/dwdxdy/p/3215136.html __syncthreads()是cuda的内建函数&#xff0c;用于块内线程通信. __syncthreads() is you garden variety thread barrier. Any thread reaching the barrier waits until all of the other threads in that block also reach i…

互联网50周年!这有它的一张“出生证明”

2019 年 10 月 29 日是互联网的 50 周年&#xff0c;50 年前(1969 年 10 月 29 日)&#xff0c;加州大学洛杉矶分校的计算机将一个只有两个字母(LO)的数据包发送到斯坦福研究所的计算机上&#xff0c;这是互联网史上的第一个数据包&#xff0c;从此开启互联网时代的第一步。 当…

Eltwise_layer简介

http://www.voidcn.com/blog/thy_2014/article/p-6117416.html common_layer&#xff1a; ArgMaxLayer类&#xff1b; ConcatLayer类&#xff1a; EltwiseLayer类&#xff1b; FlattenLayer类&#xff1b; InnerProductLayer类&#xff1b; MVNLayer类&#xff1b; SilenceLaye…