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

news2024/9/20 6:08:16

视频地址:一期视频看透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

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

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

相关文章

[数据集][目标检测]打电话检测数据集VOC+YOLO格式8985张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8985 标注数量(xml文件个数)&#xff1a;8985 标注数量(txt文件个数)&#xff1a;8985 标注…

【C++】C++入门基础,详细介绍命名空间,缺省参数,函数重载,引用,内联函数等

目录 1. 命名空间 1.1 使用命名空间的目的 1.2 命名空间定义 1.3 命名空间使用 2. 缺省参数 2.1 缺省参数概念 2.2 缺省参数分类 2.3 实际案例 2.4 注意事项 3. 函数重载 3.1 函数重载概念 3.2 函数重载原理 4. 引用 4.1 引用的概念 4.2 引用的特性 4.3 使用…

JavaScript案例---求质数

n等于19&#xff0c;是质数 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

OpenAI Gymnasium, are there any libraries with algorithms supporting it?

题意&#xff1a;对于OpenAI Gym&#xff0c;是否有支持它的算法库&#xff1f; 问题背景&#xff1a; OpenAI has released a new library called Gymnasium which is supposed to replace the Gym library. There are many libraries with implamentations of RL algorithms…

机械学习—零基础学习日志(Python做数据分析02)

现在开始使用Python尝试做数据分析。具体参考的网址链接放在了文章末尾。 引言 我通过学习《利用Python进行数据分析》这本书来尝试使用Python做数据分析。书里让下载&#xff0c;anaconda&#xff0c;使用Jupyter来写代码&#xff0c;只是下载一个anaconda的确有点费时间&am…

RabbitMQ 04 集群,用于提高系统性能

01.背景 02.单个节点的MQ会持久化的记录什么数据 03.集群情况下的MQ会持久化的记录什么数据 04.集群中的队列 单个节点的队列&#xff1a; 集群的队列&#xff1a; 05. 两个原因&#xff1a; 这样做带来的好处&#xff1a; 05.集群的交换机 交换机的本质 交换机在集…

Unity TextMeshPro 设置竖排

默认竖排是这样的 但是我们要的竖排效果并不是这样我们要是竖排连续的根据文本限制来进行换行 第一步我们先设置文本的旋转Z轴为90如下图 然后我们给文本加一个Tag <rotate270> 如下图 但是这个效果还是不是我们想要的效果我们可以使用TexeMeshPro提供的一个选项EnableR…

97.游戏的启动与多开-共享内存多开检测

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;96.游戏的启动与多开-窗口多开检测与破解 以 96.游戏的启动与多开-窗口多开检测与破解 …

Word文档的读取(1)

读取一个班的答题卡 解决方法&#xff1a; 导入os模块后&#xff0c;将乔老师的文件夹路径 /Users/qiao/answerKey 赋值给变量allKeyPath。使用os.listdir()函数获取该路径下所有的答题卡名称列表&#xff0c;并赋值给变量allItems。最后使用for循环遍历所有答题卡&#xff0c…

【知识小妙招来喽!】文件防泄密措施有哪些?这6个有效方法防止企业员工泄密!

在信息高度发达的时代&#xff0c;企业数据的安全性和保密性成为了企业运营中不可忽视的重要环节。 一旦敏感文件被泄露&#xff0c;不仅可能导致商业机密被窃取&#xff0c;还可能给企业带来重大的经济损失和声誉损害。 因此&#xff0c;采取一系列有效的文件防泄密措施&…

spring security 中的异常

一、简介 Spring Security 中异常主要分为两大类: 1、AuthenticationException: 认证异常 2、AccessDeniedException: 授权异常 AuthenticationEntryPoint 该类用来统一处理 AuthenticationException 异常 AccessDeniedHandler 该类用来统一处理 AccessDeniedException 异常…

HarmonyOS笔记

HarmonyOS简介 HarmonyOS是新一代的智能终端操作系统&#xff0c;为不同设备的智能化、互联与协同提供了统一的语言&#xff0c;为用户带来简捷&#xff0c;流畅&#xff0c;连续&#xff0c;安全可靠的全场景交互体验。 HarmonyOS结合移动生态发展的趋势&#xff0c;提出了三大…

keepalive和nginx高可用集群

keepalived 和 nginx 高可用集群搭建 主备模式 zyj86主机和zyj87主机安装nginx和keepalived yum install nginx keepalived -y systemctl enable --now nginx.service keepalived.service主调度器配置 编辑zyj86主机&#xff08;主&#xff09;配置文件 vi /etc/keepalived…

Java类和对象(2)(重点*)

封装&#xff1a; 面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主要研究的就是封装特性。何为封装呢&#xff1f;简单来说就是套壳屏蔽细节 。 封装&#xff1a;将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细节&a…

为什么用Redis?说说Redis的线程模型

使用Redis存储相比直接使用Java内存的Map有以下几个优势&#xff1a; 持久化&#xff1a; Redis支持数据持久化&#xff0c;即使发生服务器重启或意外宕机&#xff0c;数据仍然可以被恢复。而使用Java内存的Map&#xff0c;当应用程序关闭或重启时&#xff0c;数据将会丢失。…

一个工程要兼容mysql8和mysql5

将mysql8原本jar包的jdbc文件夹删除&#xff0c;然后将mysql5 jar包的jdbc文件夹和fabric文件夹拉到mysql8的jar包下&#xff0c;记得别把jar包解压再压缩&#xff0c;以避免不必要的错误&#xff0c;直接用7-zip打开压缩包&#xff0c;然后拖拽操作&#xff0c;然后完美解决&a…

Java:类和方法(1)

一 类和对象分别是什么 1.类&#xff08;class&#xff09; 类是Java中的一种蓝图或模板&#xff0c;它定义了对象的属性&#xff08;字段&#xff09;和行为&#xff08;方法&#xff09;。你可以把类看作是一个抽象的概念&#xff0c;它描述了某类事物的共性。 class 类名…

硬件工程师笔试面试——IGBT

目录 7、IGBT(绝缘栅双极晶体管) 7.1 基础 IGBT结构引脚图 IGBT实物图 7.1.1 概念 7.1.2 结构及原理 7.1.3 IGBT的安全工作区 7.1.4 IGBT分类 7.1.5 IGBT优缺点 7.2 相关问题 7.2.1 如何提高IGBT的开关速度和效率? 7.2.2 IGBT在太阳能光伏系统中的作用是什么,它如…

3GPP R18 Network energy savings(NES) 之cell DTX/DRX

在TR 21.918中可以看到cell DTX/DRX是Network energy savings(NES) for NR 的一部分,其中还包括 SSB-less SCell operation for inter-band CA等等其他内容,其相关描述如下 网络节能是 5G/NR 成功的关键,由此可以减少对环境的影响(温室气体排放)并节省运营成本。RAN WG 进…

ICE 8月各项板块盈利报告,人工智能与高频交易驱动稳定收益

Intercontinental Exchange Inc.(ICE.AI)近日发布了8月份市场交易报告和盈利数据,于8月份通过其先进的人工智能算法和高频交易系统,再次证明了在快速变化的金融市场中实现稳定收益的能力。凭借智能化的交易决策和超高的交易执行速度,ICE.AI帮助每一位用户在全球市场中获得了显著…