泛型接口例子:一个学生有一个独一无二的ID,但是每个学生的姓名不一定是唯一的。

    class Program
{
static void Main(string[] args)
{
Student<ulong> stu = new Student<ulong>();
stu.ID = 2014031026;
stu.Name = "Maomao";
}
} interface IUnique<Tid>
{
Tid ID { get; set; }
}
class Student<Tid>:IUnique<Tid>
{
public Tid ID { get; set; }
public string Name { get; set; }
}

如果这个类实现的是泛型接口,那么这个类也是泛型的,实现接口的时候必须把接口里全部的成员实现。

另一种情况,类实现的是特化之后的泛型接口,这样的类就不是泛型类了。

    class Program
{
static void Main(string[] args)
{
Student stu = new Student();
stu.ID = 2014031026;
stu.Name = "Maomao";
}
} interface IUnique<Tid>
{
Tid ID { get; set; }
}
class Student : IUnique<ulong>
{
public ulong ID { get; set; }
public string Name { get; set; }
}

直接在类继承接口的时候就注入ulong类型,则类就不需要设置为泛型类了。

泛型List

在我们的.net种,几乎所有常用的数据结构都是泛型的,编程处理的数据中,大量的数据是存储在各种各样集合中的。

常用的集合有数组,列表,链表,字典等,这些数据结构以及它们的基接口,基类都是泛型的。

这些泛型的集合,数据结构以及它们的基接口,基类都集中在名称空间

using System.Collections.Generic;
    class Program
{
static void Main(string[] args)
{
IList<int> list = new List<int>();
for (int i = 0; i < 100; i++)
{
list.Add(i);
}
foreach (var item in list)
Console.WriteLine(item);
}
}

以上是一个带有一个类型参数的IList泛型接口和带有一个类型参数的List泛型类

C#中的List相当于Java中的ArrayList,在List泛型类的背后,维护着一个数组,我们可以不停的往这个数组里放东西,

当我们放的东西太多了超过我们数组的长度的时候 ,会再生成一个更长的数组,然后把我们输入的内容copy到这个更长的数组里。

我们知道数组的长度是不能够改变的,而我们List(Java中的ArrayList)的长度是可以改变的,有的书称之为动态数组。



我们去查看一下带有一个类型参数的List泛型类定义,

它有这么多接口:

ICollection接口代表它是一个集合,我们可以向其中添加移除元素,ICollection的定义为:



可以看到其中的各种方法内也有该类型参数。

不止一个参数类型的泛型接口和泛型类:

并不是所有泛型类都是只有一个参数类型,对于Ditionary这个字典类型(索引对应数据)就有两个参数类型。



TKey是索引,TValue是数据,组成这样的映射关系关系。

我们用int类型作为IDictionary的Key的类型,string类型作为IDictionary的Value类型,

然后IDictionary泛型接口被特化成了以int类型为key,string类型为value 。

我们利用之前学过的多态知识,接口类型的IDictionary变量可以引用一个Dictionary的实例

因为Dictionary泛型类实现了IDictionary接口(上图中所示),而且它的参数类型与IDictionary一致。

代码:

    class Program
{
static void Main(string[] args)
{
IDictionary<int, string> dict = new Dictionary<int, string>();
dict[1] = "aaa";
dict[2] = "bbb";
Console.WriteLine($"Student #1 is {dict[1]}");
Console.WriteLine("Student #2 is {dict[2]}");
}
}

输出的第二行我故意不写$,可以看到区别:

泛型(Generic)接口的更多相关文章

  1. Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口

    Iterator(迭代器) 所有实现了Collection接口的容器都有一个iterator方法, 用来返回一个实现了Iterator接口的对象 Iterator对象称作迭代器, 用来方便的实现对容器 ...

  2. Java基础之Comparable接口, Collections类,Iterator接口,泛型(Generic)

    一.Comparable接口, Collections类 List的常用算法: sort(List); 排序,如果需要对自定义的类进行排序, 那就必须要让其实现Comparable接口, 实现比较两个 ...

  3. Java - 泛型 ( Generic )

    Java - 泛型 ( Generic )     > 泛型的特点         > 解决元素存储的安全性问题         > 解决获取数据元素时,需要类型强转的问题     ...

  4. 实现泛型IEnumerable接口

    用C#实现一个类的IEnumerable接口时有两种方法:1)实现非泛型IEnumerable接口:2)实现泛型IEnumerable(T)接口.如果采用方法1,当集合元素T是值类型时,将涉及到巨多的 ...

  5. Java自学-集合框架 泛型Generic

    ArrayList上使用泛型 步骤 1 : 泛型 Generic 不指定泛型的容器,可以存放任何类型的元素 指定了泛型的容器,只能存放指定类型的元素以及其子类 package property; pu ...

  6. C#泛型(Generic)

    一.什么是泛型 泛型(Generic)是C#语言2.0.通用语言运行时(CLR)2.0..NET Framework2.0推出来的新特性. 泛型为.NET框架引入类型参数(Type Parameter ...

  7. .NET知识梳理——1.泛型Generic

    1. 泛型Generic 1.1        引入泛型:延迟声明 泛型方法声明时,并未写死类型,在调用的时候再指定类型. 延迟声明:推迟一切可以推迟的. 1.2        如何声明和使用泛型 泛 ...

  8. C# 泛型Generic

    泛型(Generic),是将不确定的类型预先定义下来的一种C#高级语法,我们在使用一个类,接口或者方法前,不知道用户将来传什么类型,或者我们写的类,接口或方法相同的代码可以服务不同的类型,就可以定义为 ...

  9. 谈一谈从 Delphi 2009 之后就支援的重要功能 – 泛型 (Generic)

    前言 在C++的语言基础当中,除了物件导向.事件驱动的概念之外,模版设计(Template)也是非常重要的一环.然而,C++的开发人员能够善用模版设计的并不多.模版设计这个好物,一般还有一个名称,就是 ...

  10. JAVA中的泛型(Generic)

    Java泛型(Generic)简介 泛型是jdk1.5版本以后推出来的,表示类型参数化,让java能更具有动态性一些,让类型能变成参数传递. 要我自己感觉的话,泛型本身没啥用,跟反射在一起用,就体现出 ...

随机推荐

  1. 【记录】利用Jquery 在 textarea 内实现文字动态换行

    背景: 最近在做前端时候遇到一种情况,需要用js动态输入内容到textarea, 比如实时聊天功能,用户A每次发送信息都需要另起一行. 问题: 根据以往经验,以为用$('#textArea').htm ...

  2. Codeforces 454E. Little Pony and Summer Sun Celebration

    题意:给n个点m条边的无向图,并给出每个点的访问次数奇偶,求构造一条满足条件的路径(点和边都可以走). 解法:这道题还蛮有意思的.首先我们可以发现在一棵树上每个儿子的访问次数的奇偶是可以被它的父亲控制 ...

  3. windows线程函数必须为全局函数或者静态函数(转)

    调用CreateThread(...)创建线程时要指定所创建线程的入口函数,此入口函数只能是全局函数或者类的静态成员函数. 全局函数很容易理解,但如果是类的成员函数则必须是静态成员函数,为何, 因为类 ...

  4. 64. 输出字节流(FileOutputStream)

    IO分类:    按照数据流向分类:        输入流                输出流        按照处理的单位划分:        字节流:字节流读取的都是文件中的二进制数据,读取到的 ...

  5. KeepLived + nginx 高可用

    . 环境准备 1. VMware; 2. 4台CentOs7虚拟主机:192.168.122.217, 192.168.122.165 3. 系统服务:LVS, Keepalived 4. Web服务 ...

  6. Java中使用try-catch-finally处理IO流中的异常

    我们使用try-catch-finally来接收IO流的异常 finally是最后执行的步骤,非常适合最后存放close来关闭IO流,而且编程中我们不可以随意抛出异常,必须对异常进行处理. 从try- ...

  7. 数字三角形W(加强版) codevs 2189

    2189 数字三角形W 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 数字三角形 要求走到最后mod 100最大 输入描述 Inpu ...

  8. WdatePicker.js的使用方法 帮助文档 (日历控件)

    WdatePicker配置和功能 一.配置 日期范围限制 静态限制 注意:日期格式必须与 realDateFmt 和 realTimeFmt 一致 你可以给通过配置minDate(最小日期),maxD ...

  9. 其它课程中的python---5、Pandas处理数据和读取数据

    其它课程中的python---5.Pandas处理数据和读取数据 一.总结 一句话总结: 记常用和特例:慢慢慢慢的就熟了,不用太着急,慢慢来 库的使用都很简单:就是库的常用函数就这几个,后面用的时候学 ...

  10. CSS:CSS 组合选择符

    ylbtech-CSS:CSS 组合选择符 1.返回顶部 1. CSS 组合选择符 CSS 组合选择符 组合选择符说明了两个选择器直接的关系. CSS组合选择符包括各种简单选择符的组合方式. 在 CS ...