当前位置: 首页 > news >正文

[C#学习笔记]接口的特性与用法

视频地址:一期视频看透C#接口的全部特性及用法_哔哩哔哩_bilibili

强烈推荐学习C#和WPF的朋友关注此UP,知识点巨多,讲解透彻!

一、总览

public interface IOverall
{/// <summary>/// 最普通的方法/// </summary>void Foo();/// <summary>/// 属性/// </summary>string Name { get;set; }/// <summary>/// 索引器/// </summary>/// <param name="index"></param>/// <returns></returns>int this[int index] { get; set; }/// <summary>/// 事件/// </summary>event EventHandler OnNameChanged;/// <summary>/// 带默认实现的方法/// </summary>void Bar() => Console.WriteLine("Bar");/// <summary>/// 私有方法(需要带默认实现)/// </summary>private void NonPublicMethod1() => Console.WriteLine("Private");/// <summary>/// 受保护方法(需要带默认实现,或者可以不实现,继承后实现)/// </summary>protected void NonPublicMethod2() => Console.WriteLine("Protected");/// <summary>/// 静态方法(需要带默认实现)/// </summary>static void StaticMethod() => Console.WriteLine("Static");/// <summary>/// 抽象静态方法/// </summary>static abstract void AbstractStaticMethod();/// <summary>/// 静态虚方法(需要带默认实现)/// </summary>static virtual void VirtualStaticMethod() => Console.WriteLine("Virtual Static");
}

二、带默认实现的方法

C# 8.0引入

如果接口的方法提供了一个默认实现,那么实现该接口的类可以不实现此方法。

如果实现了此方法,则会覆盖接口中的默认实现,可以理解为接口中带默认实现的方法其实是virtual,而类中的如果实现了此方法,其实是override。

2.1 用法

参考以下代码:

Test test = new Test();
((IFoo1)test).Foo1();
((IFoo1)test).Foo2();public interface IFoo1
{	void Foo1(){$"这是{nameof(IFoo1)}中{nameof(Foo1)}的默认实现".Dump();}void Foo2(){$"这是{nameof(IFoo1)}中{nameof(Foo2)}的默认实现".Dump();}
}class Test : IFoo1
{	public void Foo1(){$"这是{nameof(Test)}中{nameof(Foo1)}的实际实现".Dump();}
}

输出结果为

这是Test中Foo1的实际实现
这是IFoo1中Foo2的默认实现

对于带默认实现的方法,如果类中不实现此方法,调用时需要先将类转换成接口,再调接口上的方法,参考以下代码:

Test test = new Test();
((IFoo1)test).Foo1();
((IFoo2)test).Foo1();public interface IFoo1
{void Foo1(){$"这是{nameof(IFoo1)}中{nameof(Foo1)}的默认实现".Dump();}
}public interface IFoo2
{void Foo1(){$"这是{nameof(IFoo2)}中{nameof(Foo1)}的默认实现".Dump();}
}class Test : IFoo1,IFoo2
{	}

接口IFoo1和IFoo2都有一个带默认实现的方法,且名称相同,类Test实现了IFoo1和IFoo2,如果直接能访问到接口中的方法Foo1,就会造成冲突。

2.2 应用场景

在不破坏影响已有实现的情况下,可以添加新成员。这解决了在第三方已经大量使用了的接口上进行扩展带来问题的痛点。

2.3 private,带默认实现的方法

只能在接口内调用,子接口,实现接口的类中不可访问,参考以下代码

Test test = new Test();
((IFoo1)test).Foo1();public interface IFoo1
{	void Foo1(){Foo2();}private void Foo2(){$"这是{nameof(IFoo1)}中{nameof(Foo2)}的默认实现".Dump();}
}class Test : IFoo1
{	}

2.4 protected,带默认实现的方法

可以在子接口中调用或者覆盖,实现接口的类不可访问

参考以下代码:


Test1 test1 = new Test1();
((IFoo2)test1).Foo2();
((IFoo3)test1).Foo2();public interface IFoo1
{	protected void Foo1(){$"这是{nameof(IFoo1)}中{nameof(Foo1)}的默认实现".Dump();}
}public interface IFoo2 : IFoo1
{void Foo2(){Foo1();}
}public interface IFoo3 : IFoo1
{void Foo2(){Foo1();}new void Foo1(){$"这是{nameof(IFoo3)}中{nameof(Foo1)}的默认实现".Dump();}
}class Test1:IFoo2,IFoo3
{
}

运行结果

这是IFoo1中Foo1的默认实现
这是IFoo3中Foo1的默认实现

2.5 Static,带默认实现的方法

静态方法一般用于处理泛型类

参考以下代码:

var student = IDeserializable<Student>.Deserialize("{\"Id\":42,\"Name\":\"Jack\"}");
student.Dump();interface IDeserializable<T> 
{static T? Deserialize(string json) => JsonSerializer.Deserialize<T>(json);
}class Student : IDeserializable<Student>
{public int Id	{get;set;}public string Name { get; set; }
}

运行结果:

三、static abstract,抽象静态方法

在接口可不实现,实现此接口的类必须要实现此方法

应用场景:

3.1 约束子类具有方法Deserializable,实现序列化功能

interface IDeserializable<T>
{static abstract T Deserializable(string json);
}class MyDataModel : IDeserializable<MyDataModel>
{public static MyDataModel Deserializable(string json){return JsonSerializer.Deserialize<MyDataModel>(json);}
}

3.2 如工厂类中具有方法Create,提供创建功能

    interface IFactory<T>{static abstract T Create();}class ClassToBeCreated{}class ClassWithFactoryMethod : IFactory<ClassToBeCreated>{public static ClassToBeCreated Create(){return new ClassToBeCreated();}}

3.3 约束子类实现静态单例

    interface ISingleton<T> where T : ISingleton<T>{static abstract T Instance { get; }}class SingletonClass : ISingleton<SingletonClass>{private static readonly Lazy<SingletonClass> instanceHolder = new Lazy<SingletonClass>();public static SingletonClass Instance => instanceHolder.Value;}

3.4 逻辑运算法,提供自定义逻辑运算

 interface IOperators<T> where T : IOperators<T>{static abstract T operator +(T left, T right);static abstract T operator -(T left, T right);}class MyNumber : IOperators<MyNumber>{public int Value { get; }public MyNumber(int value){Value = value;}public static MyNumber operator +(MyNumber left, MyNumber right){return new MyNumber(left.Value + right.Value);}public static MyNumber operator -(MyNumber left, MyNumber right){return new MyNumber(left.Value - right.Value);}}

四、static virtual 静态虚方法

通常用于泛型调用的场合

特性:

1.子类如果未实现具体方法,调用时调用接口中的方法

2.子类如果实现具体方法,调用时调用子类中的方法

代码:

TestCallerInstance(new A());
TestCallerInstance(new B());
ITestInterfaceGenric<A>.TestCallerGeneric();
ITestInterfaceGenric<B>.TestCallerGeneric();static void TestCallerInstance<T>(T t) where T : ITestInterface
{Console.WriteLine(T.TestString1());
}public interface ITestInterface
{static virtual string TestString1(){return "TestString1 ITestInterface";}
}public interface ITestInterfaceGenric<TSelf> where TSelf : ITestInterfaceGenric<TSelf>
{public static void TestCallerGeneric(){Console.WriteLine(TSelf.TestString2());}static virtual string TestString2(){return "TestString2 ITestInterfaceGeneric";}
}public class A : ITestInterface, ITestInterfaceGenric<A>
{public static string TestString2(){return "TestString A";}
}public class B : ITestInterface, ITestInterfaceGenric<B>
{public static string TestString1(){return "TestString1 ITestInterface B";}
}

运行结果:

TestString1 ITestInterface
TestString1 ITestInterface B
TestString A
TestString2 ITestInterfaceGeneric

相关文章:

[C#学习笔记]接口的特性与用法

视频地址&#xff1a;一期视频看透C#接口的全部特性及用法_哔哩哔哩_bilibili 强烈推荐学习C#和WPF的朋友关注此UP&#xff0c;知识点巨多&#xff0c;讲解透彻&#xff01; 一、总览 public interface IOverall {/// <summary>/// 最普通的方法/// </summary>v…...

java发送邮件报错,Could not connect to SMTP host: smtp.exmail.qq.com, port: 465

发现问题 我使用的 docker 运行的 jdk 环境&#xff0c;服务调用发送邮件报错 javax.mail.MessagingException: Could not connect to SMTP host: smtp.exmail.qq.com, port: 465;nested exception is:javax.net.ssl.SSLHandshakeException: No appropriate protocol (protoc…...

开放式耳机有哪些好处?性价比排行前十的四款蓝牙耳机推荐

开放式耳机有以下好处&#xff1a; 佩戴舒适&#xff1a;开放式耳机不入耳&#xff0c;不堵塞耳道&#xff0c;长时间佩戴耳朵不易感到闷热和疼痛&#xff0c;相比传统入耳式耳机&#xff0c;能减少对耳道的压迫感和摩擦&#xff0c;让耳朵更舒适。 更健康卫生&#xff1a;不入…...

FreeRTOS(速记版)

第一章 初识 FreeRTOS 1.1 FreeRTOS简介 FreeRTOS 采用了 MIT 开源许可&#xff0c;这允许将 FreeRTOS 操作系统用于商业应用&#xff0c;并且不需要公开源代码。此外&#xff0c;FreeRTOS 还衍生出了另外两个操作系统&#xff1a;OpenRTOS 和 SafeRTOS&#xff0c;其中 OpenR…...

解锁中东市场新蓝海:Bigo社交媒体如何赋能APP广告营销优势

解锁中东市场新蓝海&#xff1a;Bigo社交媒体如何赋能APP广告营销优势 在全球数字化浪潮的推动下&#xff0c;中东地区以其独特的文化背景、高速的经济增长以及庞大的年轻消费群体&#xff0c;成为了众多品牌与APP开发者竞相争夺的市场高地。作为该地区颇具影响力的社交媒体平…...

【网络】DNS

definition DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;服务器是互联网上的重要基础设施之一&#xff0c;它的主要作用是将人们易于记忆的域名&#xff08;如www.example.com&#xff09;转换成计算机可以直接识别的IP地址&#xff08;如192.0.2.1&am…...

如何使用ChatGPT,完成学术论文文献综述的编写?

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术研究中&#xff0c;文献综述是了解研究现状、辨识研究空白并为自己的研究奠定理论基础的关键环节。ChatGPT 可以在文献综述的编写过程中提供有效的支持&#xff0c;从文献搜集、批…...

探索GPU算力在大模型和高性能计算中的无限潜能

在当今科技领域&#xff0c;大模型和高性能计算正以惊人的速度发展。大模型如语言模型、图像识别模型等&#xff0c;规模越来越大&#xff0c;精度越来越高&#xff0c;能够处理复杂的任务和生成逼真的结果。高性能计算则凭借强大的计算能力&#xff0c;推动着科学研究、工程设…...

【信创】统信UOS图形界面登录闪退的解决方法

原文链接&#xff1a;【信创】统信UOS图形界面登录闪退的解决方法 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于统信UOS 1070桌面操作系统中&#xff0c;图形界面登录时出现闪退或输入正确的用户名和密码后又跳转回登录界面问题的解决方法的文章。这种问题可能…...

排序(插入,希尔,选择,堆,冒泡,快速,归并,计数)

本文中的Swap()函数都是下面这段代码 // 交换 void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; }文章目录 常见排序&#xff1a;一.插入排序1.直接插入排序&#xff1a;2.希尔排序&#xff1a; 二.选择排序1.选择排序&#xff1a;2.堆排序&#xff1a; 三.交换排…...

【recast-navigation/源码解析】findStraightPath详解以及寻路结果贴边优化

说在前面 recast-navigation版本&#xff1a;1.6.0 叉积cross product 正常来讲&#xff0c;叉乘为&#xff1a; ∣ A ⃗ B ⃗ ∣ ∣ x A y A x B y B ∣ x A ⋅ y B − x B ⋅ y A |\vec{A} \times \vec{B}|\begin{vmatrix} x_A & y_A \\ x_B & y_B \end{vmatrix…...

‌移动管家手机智能控制汽车系统

‌ 手机可以通过下载特定的应用程序来控制汽车系统&#xff0c;实现远程启动、锁/解锁车门、调节车内温度等功能。‌ ‌ 手机智能控制汽车系统主要通过下载并安装特定的APP来实现。‌ 首先&#xff0c;用户需要确定自己的手机系统是安卓还是苹果版&#xff0c;然后前往应用…...

828华为云征文|华为云Flexus X实例Redis性能加速评测及对比

目录 前言 一、华为云Flexus X加速Redis购买 1.1 Flexus X实例购买 1.2 Redis加速镜像选择 1.3 重置密码 1.4 登录Flexus X实例 1.5 Flexus X实例Redis验证 二、Redis测评工具介绍 三、华为云Flexus X实例加速Redis测评 3.1 string类型 3.2 hash类型 3.3 list类型 3.4 set类型 …...

【OpenCV3】图像的翻转、图像的旋转、仿射变换之图像平移、仿射变换之获取变换矩阵、透视变换

1 图像的放大与缩小 2 图像的翻转 3 图像的旋转 4 仿射变换之图像平移 5 仿射变换之获取变换矩阵 6 透视变换 1 图像的放大与缩小 resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) src: 要缩放的图片dsize: 缩放之后的图片大小, 元组和列表表示均可.dst: 可选参数, 缩…...

不要认为996是开玩笑

996 预防针 随着秋招进程的不断推进&#xff0c;有部分同学已经 OC&#xff0c;有部分同学还在苦苦挣扎&#xff0c;并不断降低自己的预期&#xff0c;包括在和 HR 沟通过程中&#xff0c;主动说出自己愿意接受加班&#xff0c;愿意接受 996&#xff0c;以此来博得企业方面的加…...

精益工程师资格证书:2024年CLMP报名指南

随着全球对精益管理的需求日益增长&#xff0c;精益管理专业人士资格认证&#xff08;CLMP&#xff09;正成为越来越多精益工程师和精益管理人员提升职业竞争力的首选。作为一种注重管理而非生产的认证&#xff0c;CLMP不仅适用于制造业的专业人士&#xff0c;也吸引了各行业的…...

【Unity基础】如何选择脚本编译方式Mono和IL2CPP?

Edit -> Project Settings -> Player 在 Unity 中&#xff0c;Scripting Backend 决定了项目的脚本编译方式&#xff0c;即如何将 C# 代码转换为可执行代码。Unity 提供了两种主要的 Scripting Backend 选项&#xff1a;Mono 和 IL2CPP。它们之间的区别影响了项目的性能、…...

写在OceanBase开源三周年

我收获的深刻感触get 感触1&#xff1a;解决问题才有生存价值 [产品力] 感触2&#xff1a;永无止境的“易用性” [易用性] 感触3&#xff1a;立下“双赢”的flag 感触4&#xff1a;社区建设离不开用户和开发者参与 感触5&#xff1a;从易用到用户自助 [自助能力] 当时想法很简…...

【笔记】408刷题笔记

文章目录 三对角三叉树求最小带权路径UDP报文首部和TCP报文首部IP报文首部TCP报文首部UDP报文首部 刷新和再生的区别地址译码 为了区分队空队满&#xff0c;可以使用三种处理方式 1&#xff09;牺牲一个单元 队头指针在队尾指针的下一位置作为队满的标志 队满条件&#xff1a;(…...

GitHub Star 数量前 13 的自托管项目清单

一个多月前&#xff0c;我们撰写并发布了这篇文章《终极自托管解决方案指南》。在那篇文章里我们深入探讨了云端服务与自托管方案的对比、自托管的潜在挑战、如何选择适合自托管解决方案&#xff0c;并深入介绍了五款涵盖不同场景的优秀自托管产品。 关于自托管的优势&#xf…...

音频可视化工具:Lano Visualizer打造沉浸式桌面音乐体验

音频可视化工具&#xff1a;Lano Visualizer打造沉浸式桌面音乐体验 【免费下载链接】Lano-Visualizer A simple but highly configurable visualizer with rounded bars. 项目地址: https://gitcode.com/gh_mirrors/la/Lano-Visualizer 在数字生活中&#xff0c;音乐不…...

工业现场的空压机监控总得整点活吧?今天咱们拿MCGS6.2搞个仿真系统,带曲线报警和报表那种。直接上干货,先开工程建个空压机模型

空压机mcgs6.2仿真&#xff0c;带曲线报警和报表界面在设备窗口拖个模拟设备&#xff0c;配四个关键变量&#xff1a;出口压力&#xff08;0-1.6MPa&#xff09;、运行温度&#xff08;0-120℃&#xff09;、电机电流&#xff08;0-50A&#xff09;、运行状态&#xff08;0/1&a…...

从‘噬菌体’到清晰地图:我的LIO-SAM避坑实战记录(含Ubuntu版本选择建议)

从“噬菌体”到清晰地图&#xff1a;LIO-SAM实战避坑指南与Ubuntu版本选择建议 第一次在RViz里看到那个旋转成筒状的地图时&#xff0c;我盯着屏幕足足愣了三分钟——这和我预想中的高精度点云地图相差了十万八千里。更令人崩溃的是&#xff0c;当我把设备搬到室外测试时&#…...

嵌入式开发调试与问题诊断实战指南

嵌入式工程师常见问题诊断与调试经验分享1. 典型开发场景分析1.1 开发环境差异问题"在我的开发环境运行正常"是嵌入式工程师最常遇到的困境之一。这种现象通常源于&#xff1a;编译器版本差异&#xff08;GCC/Keil/IAR版本不一致&#xff09;硬件平台差异&#xff08…...

冥想第一千八百三十三天(1833)

1.昨天晚上电动车刹车终于修好了&#xff0c;刹车更紧了&#xff0c;今天的天气很热了&#xff0c;明天就还薄款的运动衣。 2.感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人&#xff0c;感谢不断进步的自己。...

Mac/Win/Linux全平台实测:用Ollama一键部署DeepSeek-R1 7B模型,附硬件配置建议

Mac/Win/Linux全平台实测&#xff1a;用Ollama一键部署DeepSeek-R1 7B模型&#xff0c;附硬件配置建议 去年在帮创业团队搭建本地AI开发环境时&#xff0c;我试遍了市面上所有开源模型部署方案。当Ollama首次支持DeepSeek-R1时&#xff0c;其跨平台兼容性让我眼前一亮——同一套…...

Go语言依赖管理:从GOPATH到Go Modules

Go语言依赖管理&#xff1a;从GOPATH到Go Modules 作为一个写了十几年代码的Go后端老兵&#xff0c;我经历了Go语言依赖管理的从GOPATH到Go Modules的转变&#xff0c;踩了不少坑。今天就来分享一下Go语言依赖管理的实践经验。 一、依赖管理的演进 1. GOPATH时代 在Go 1.11之前…...

从ChatGPT到机器翻译:GRPO算法如何优化大语言模型的生成效果?

GRPO算法&#xff1a;大语言模型生成效果优化的新范式 在自然语言处理领域&#xff0c;序列生成任务的质量优化一直是研究热点。从ChatGPT的对话流畅度到机器翻译的准确性&#xff0c;生成效果直接影响用户体验。传统优化方法如PPO虽然有效&#xff0c;但在处理复杂语言任务时存…...

Qt安卓开发实战:从红米K60调试到多机型适配指南

1. Qt安卓开发环境准备 搞Qt安卓开发&#xff0c;首先得把环境搭好。这里假设你已经按照官方文档或者教程配置好了Qt Creator和Android SDK/NDK。如果还没搞定&#xff0c;建议先去Qt官网把Android开发套件下载齐全&#xff0c;包括&#xff1a; Qt for Android&#xff08;建议…...

从DEM到决策:如何用QGIS分析河北地形,为生态保护与项目选址提供依据?

从DEM到决策&#xff1a;QGIS地形分析在河北生态保护与项目选址中的实战指南 河北省复杂的地形地貌为各类生态保护和工程项目带来了独特挑战。作为华北地区生态屏障与经济发展的重要区域&#xff0c;如何科学评估地形特征直接影响着规划决策的质量。本文将带您用QGIS这一开源工…...