windows C#-泛型接口

为泛型集合类或表示集合中的项的泛型类定义接口通常很有用处。 为避免对值类型执行装箱和取消装箱操作,最好对泛型类使用泛型接口,例如 IComparable<T>。 .NET 类库定义多个泛型接口,以便用于 System.Collections.Generic 命名空间中的集合类。 

接口被指定为类型参数上的约束时,仅可使用实现接口的类型。 如下代码示例演示一个派生自 GenericList<T> 类的 SortedList<T> 类。SortedList<T> 添加约束 where T : IComparable<T>。 此约束可使 SortedList<T> 中的 BubbleSort 方法在列表元素上使用泛型 CompareTo 方法。 在此示例中,列表元素是一个实现 IComparable<Person> 的简单类 Person。

//Type parameter T in angle brackets.
public class GenericList<T> : System.Collections.Generic.IEnumerable<T>
{protected Node head;protected Node current = null;// Nested class is also generic on Tprotected class Node{public Node next;private T data;  //T as private member datatypepublic Node(T t)  //T used in non-generic constructor{next = null;data = t;}public Node Next{get { return next; }set { next = value; }}public T Data  //T as return type of property{get { return data; }set { data = value; }}}public GenericList()  //constructor{head = null;}public void AddHead(T t)  //T as method parameter type{Node n = new Node(t);n.Next = head;head = n;}// Implementation of the iteratorpublic System.Collections.Generic.IEnumerator<T> GetEnumerator(){Node current = head;while (current != null){yield return current.Data;current = current.Next;}}// IEnumerable<T> inherits from IEnumerable, therefore this class// must implement both the generic and non-generic versions of// GetEnumerator. In most cases, the non-generic method can// simply call the generic method.System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator(){return GetEnumerator();}
}public class SortedList<T> : GenericList<T> where T : System.IComparable<T>
{// A simple, unoptimized sort algorithm that// orders list elements from lowest to highest:public void BubbleSort(){if (null == head || null == head.Next){return;}bool swapped;do{Node previous = null;Node current = head;swapped = false;while (current.next != null){//  Because we need to call this method, the SortedList//  class is constrained on IComparable<T>if (current.Data.CompareTo(current.next.Data) > 0){Node tmp = current.next;current.next = current.next.next;tmp.next = current;if (previous == null){head = tmp;}else{previous.next = tmp;}previous = tmp;swapped = true;}else{previous = current;current = current.next;}}} while (swapped);}
}// A simple class that implements IComparable<T> using itself as the
// type argument. This is a common design pattern in objects that
// are stored in generic lists.
public class Person : System.IComparable<Person>
{string name;int age;public Person(string s, int i){name = s;age = i;}// This will cause list elements to be sorted on age values.public int CompareTo(Person p){return age - p.age;}public override string ToString(){return name + ":" + age;}// Must implement Equals.public bool Equals(Person p){return (this.age == p.age);}
}public class Program
{public static void Main(){//Declare and instantiate a new generic SortedList class.//Person is the type argument.SortedList<Person> list = new SortedList<Person>();//Create name and age values to initialize Person objects.string[] names =["Franscoise","Bill","Li","Sandra","Gunnar","Alok","Hiroyuki","Maria","Alessandro","Raul"];int[] ages = [45, 19, 28, 23, 18, 9, 108, 72, 30, 35];//Populate the list.for (int x = 0; x < 10; x++){list.AddHead(new Person(names[x], ages[x]));}//Print out unsorted list.foreach (Person p in list){System.Console.WriteLine(p.ToString());}System.Console.WriteLine("Done with unsorted list");//Sort the list.list.BubbleSort();//Print out sorted list.foreach (Person p in list){System.Console.WriteLine(p.ToString());}System.Console.WriteLine("Done with sorted list");}
}

可将多个接口指定为单个类型上的约束,如下所示:

class Stack<T> where T : System.IComparable<T>, IEnumerable<T>
{
}

一个接口可定义多个类型参数,如下所示:

interface IDictionary<K, V>
{
}

适用于类的继承规则也适用于接口:

interface IMonth<T> { }interface IJanuary : IMonth<int> { }  //No error
interface IFebruary<T> : IMonth<int> { }  //No error
interface IMarch<T> : IMonth<T> { }    //No error//interface IApril<T>  : IMonth<T, U> {}  //Error

如果泛型接口是协变的(即,仅使用自身的类型参数作为返回值),那么这些接口可继承自非泛型接口。 在 .NET 类库中,IEnumerable<T> 继承自 IEnumerable,因为 IEnumerable<T> 在 GetEnumerator 的返回值和 Current 属性 Getter 中仅使用 T。

具体类可实现封闭式构造接口,如下所示:

interface IBaseInterface<T> { }class SampleClass : IBaseInterface<string> { }

只要类形参列表提供接口所需的所有实参,泛型类即可实现泛型接口或封闭式构造接口,如下所示:

interface IBaseInterface1<T> { }
interface IBaseInterface2<T, U> { }class SampleClass1<T> : IBaseInterface1<T> { }          //No error
class SampleClass2<T> : IBaseInterface2<T, string> { }  //No error

控制方法重载的规则对泛型类、泛型结构或泛型接口内的方法一样。

从 C# 11 开始,接口可以声明 static abstract 或 static virtual 成员。 声明任一 static abstract 或 static virtual 成员的接口几乎始终是泛型接口。 编译器必须在编译时解析对 static virtual 和 static abstract 方法的调用。 接口中声明的 static virtual 和 static abstract 方法没有类似于类中声明的 virtual 或 abstract 方法的运行时调度机制。 相反,编译器使用编译时可用的类型信息。 这些成员通常是在泛型接口中声明的。 此外,声明 static virtual 或 static abstract 方法的大多数接口都声明了其中一个类型参数必须实现已声明的接口。 然后,编译器使用提供的类型参数来解析声明成员的类型。

 

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

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

相关文章

一.MySQL程序简介

整体介绍 1.服务端mysqld(可执行文件) mysqld --verbose --help 2.客户端mysql(可执行文件) 3.其它工具包程序

G1垃圾回收器的FullGC

如何确定GarbageFirst回收器发生的是FullGC ? 必须出现FullGC字样才算是FUllGC&#xff0c;例如下图&#xff1a;因为内存分配失败&#xff08;Allocation Failure&#xff09;导致 如果不出现FullGC的字样说明它不是FUllGC&#xff0c;并不像Serial GC、ParallelGC的在老年代…

Sql 创建用户

Sql server 创建用户 Sql server 创建用户SQL MI 创建用户修改其他用户密码 Sql server 创建用户 在对应的数据库执行&#xff0c;该用户得到该库的所有权限 test.database.chinacloudapi.cn DB–01 DB–02 创建服务器登录用户 CREATE LOGIN test WITH PASSWORD zDgXI7rsafkak…

腾讯云AI代码助手编程挑战赛-武器大师

作品简介 对话过程能够介绍二战 各种武器 冷战 武器 现代的 各种武器装备&#xff0c;陆海空三军都知道。 技术架构 使用全后端分离的架构&#xff0c;前端使用Vue脚手架&#xff0c;腾讯云修改样式css 开发环境、开发流程 系统&#xff1a;win11 开发工具&#xff1a;VS…

Maven核心插件之maven-resources-plugin

前言 Maven 插件是 Maven 构建系统的重要组成部分&#xff0c;它们为 Maven 提供了丰富的功能和扩展能力&#xff0c;使得 Maven 不仅是一个构建工具&#xff0c;更是一个强大的项目管理平台。在 Maven 项目中&#xff0c;插件的使用通常通过配置 pom.xml 文件来完成。每个插件…

Golang的文件加密技术研究与应用

Golang的文件加密技术研究与应用 一、加密技术概述 文件加密的重要性 文件加密是指通过对文件进行加密操作&#xff0c;将文件内容转化为一段难以理解的数据。这样可以保护文件的隐私和安全&#xff0c;防止文件被未授权的用户访问和窃取。在日常工作和生活中&#xff0c;我们经…

Redis之秒杀活动

目录 全局唯一ID&#xff1a; 为什么 count 不可能为 null&#xff1f; 为什么返回值是 timestamp << COUNT_BITS | count&#xff1f; 整体的逻辑 (1) 生成时间戳 (2) 生成序列号 (3) 拼接时间戳和序列号 超卖问题&#xff1a; 基于版本号的乐观锁 CAS思想 …

VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案

在Windows11上使用VSCode开发C程序的时候&#xff0c;由于使用到了Cmake Tools插件&#xff0c;在编译运行的时候&#xff0c;会出现输出日志乱码的情况&#xff0c;那么如何解决呢&#xff1f; 这里提供了解决方案&#xff1a; 当Settings里的Cmake: Output Log Encoding里设…

【C++经典例题】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a; 期待您的关注 题目描述&#xff1a; 原题链接&#xff1a; 求123...n_牛客题霸_牛客网 (nowcoder.com) 解题思路&#xff1a; …

STM32 单片机 练习项目 LED灯闪烁LED流水灯蜂鸣器 未完待续

个人学习笔记 文件路径&#xff1a;程序源码\STM32Project-DAP&DAPmini\1-1 接线图 3-1LED闪烁图片 新建项目 新建项目文件 选择F103C8芯片 关闭弹出窗口 拷贝资料 在项目内新建3个文件夹 Start、Library、User Start文件拷贝 从资料中拷贝文件 文件路径&#xff1a;固…

DAY15 神经网络的参数和变量

DAY15 神经网络的参数和变量 一、参数和变量 在神经网络中&#xff0c;参数和变量是两个关键概念&#xff0c;它们分别指代不同类型的数据和设置。 参数&#xff08;Parameters&#xff09; 定义&#xff1a;参数是指在训练过程中学习到的模型内部变量&#xff0c;这些变量…

VS Code 可视化查看 C 调用链插件 C Relation

简介 一直想用 SourceInsight 一样的可以查看函数调用链一样的功能&#xff0c;但是又不想用 SourceInsight&#xff0c;找了一圈没有找到 VS Code 有类似功能的插件&#xff0c;索性自己开发了一个。 这是一个可以可视化显示 C 函数调用关系的 VS Code 插件&#xff0c;功能纯…

(k8s)kubectl不断重启问题解决!

1.问题描述&#xff1a; 在服务器上安装完k8s之后&#xff0c;会出现kubectl有时候连得上&#xff0c;等之后再去连接的时候又断开&#xff0c;同时节点出现了NotReady的情况&#xff0c; 出现了这两种双重症状 2.解决问题 自己的思路&#xff1a;查看日志&#xff0c;检查报…

什么是数据湖?大数据架构的未来趋势

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

【Leetcode·中等·数组】59. 螺旋矩阵 II(spiral matrix ii)

题目描述 英文版描述 Given a positive integer n, generate an n x n matrix filled with elements from 1 to n(2) in spiral order. Example 1: Input: n 3 Output: [[1,2,3],[8,9,4],[7,6,5]] 提示&#xff1a; 1 < n < 20 英文版地址 https://leetcode.com…

Open WebUI 与 AnythingLLM 安装部署

在前文 Ollama私有化部署大语言模型LLM&#xff08;上&#xff09;-CSDN博客 中通过Ollama来搭建运行私有化大语言模型&#xff0c;但缺少用户交互的界面&#xff0c;特别是Web可视化界面。 对此&#xff0c;本文以Open WebUI和AnythingLLM为例分别作为Ollama的前端Web可视化界…

论文导读 | 数据库系统中基于机器学习的基数估计方法

背景 基数估计任务是在一个查询执行之前预测其基数&#xff0c;基于代价的查询优化器&#xff08;Cost Based Optimizer&#xff09;将枚举所有可能的执行计划&#xff0c;并利用估计的基数选出期望执行代价最小的计划&#xff0c;从而完成查询优化的任务。 然而&#xff0c;…

3D扫描建模有哪些优势和劣势?

3D扫描建模作为一种先进的数字化手段&#xff0c;在多个领域展现出了巨大的潜力和价值&#xff0c;但同时也存在一些劣势。以下是对3D扫描建模优势和劣势的详细分析&#xff1a; 3D扫描建模的优势 高精度数据采集&#xff1a; 三维扫描技术能够以极高的精度获取物体的三维数…

网络安全 信息收集入门

1.信息收集定义 信息收集是指收集有关目标应用程序和系统的相关信息。这些信息可以帮助攻击者了解目标系统的架构、技术实现细节、运行环境、网络拓扑结构、安全措施等方面的信息&#xff0c;以便我们在后续的渗透过程更好的进行。 2.收集方式-主动和被动收集 ①收集方式不同…

MBM指尖六维力触觉传感器:高灵敏度、低漂移,精准掌控力学世界

MBM指尖六维力触觉传感器是一种专为机器人设计的高性能传感器。它通过集成三轴力和三轴力矩的感知能力&#xff0c;能够精准捕捉复杂的力学信息。传感器采用MEMS与应变体复合测量技术&#xff0c;具备数字输出功能&#xff0c;显著降低漂移并减少安装偏移的影响。其紧凑轻便的设…