`
阿尔萨斯
  • 浏览: 4206353 次
社区版块
存档分类
最新评论

C# 泛型接口

 
阅读更多

使用泛型可以定义接口,在接口中定义的方法可以带泛型参数。

比如,我们要实现一个IComparable接口来对两个类的对象的属性进行比较。传统的我们会这么做:

    public class Person : IComparable
    {
        public string LastName { get; set; }

        public Person(string lastName) { this.LastName = lastName; }

        public int CompareTo(object obj)
        {
            Person other = obj as Person; //这里需要做强制转换,然后才能对属性进行比较
            return this.LastName.CompareTo(other.LastName);
        }
    }
我们看一下引入泛型接口之后,会发生什么变化:

同样的我们还是要实现IComparable接口,不同的是这是一个泛型接口

    public class Person : IComparable<Person>
    {
        public string LastName { get; set; }

        public Person(string lastName) { this.LastName = lastName; }

        public int CompareTo(Person other)
        {
            return this.LastName.CompareTo(other.LastName);//这里可以直接对属性进行操作,不需要之前的转换过程了
        }
    }

然后就可以在main函数中测试一下上面的代码:

        static void Main(string[] args)
        {
            Person[] person = new Person[] { new Person("Microsoft"), new Person("google") };
            int result = person[0].LastName.CompareTo(person[1].LastName);
            Console.WriteLine(result);//输出1
        }

上述的例子说明了一点,泛型接口就是带泛型类型的接口,与普通的接口相比,多了类型的约束。.NET1.0就有了基于对象的IComparable接口,IComparable<in T>基于一个泛型类型:

    public interface IComparable<in T>
    {
        int CompareTo(T other);
    }

接下来,讲两个与泛型接口有关的两个概念:协变和抗变。

先定义一个基类Shape:

    public class Shape
    {
        public double Width { get; set; }
        public double Height { get; set; }

        public override string ToString()
        {
            return string.Format("width:{0},height:{1}", Width, Height);
        }
    }
再定义一个泛型接口:泛型类型用out关键字标注,表明泛型接口是协变的(也就是说返回类型只能是T),并从一个只读索引器中返回这个类型。

    public interface IDisPlay<out T>
    {
        T this[int index] { get; }
    }

接下来定义一个Rectangle子类继承Shape类,并实现泛型接口IDisPlay(out T)。

    public class Rectangle : Shape, IDisPlay<Shape>
    {
        Shape IDisPlay<Shape>.this[int index]
        {
            get
            {
                if (index != 0)
                {
                    throw new ArgumentOutOfRangeException("index");
                }
                else
                {
                    this.Width = 400;
                    this.Height = 500;
                    return this;
                }
            }
        }
    }

最后我们测试一下结果:

        static void Main(string[] args)
        {
            IDisPlay<Shape> shapeDisplay = new Rectangle();//把实现了泛型接口的类对象赋值给泛型接口
            Console.WriteLine(shapeDisplay[0].ToString());//通过泛型接口的索引器访问,返回这个对象
        }
确实输出了我们想要的结果:width:400,height:500.

如果泛型类型用in关键字标注,泛型接口就是抗变的。

分享到:
评论

相关推荐

    C#泛型接口实例

    C# 实现泛型接口

    C#泛型类、泛型方法、泛型接口、泛型委托的实例

    泛型类、泛型方法、泛型接口、泛型委托 泛型类、泛型方法、泛型接口、泛型委托

    C# 泛型,以及泛型接口的,简单的工厂模式,实现新闻阅览器

    C# 泛型,以及泛型接口的,简单的工厂模式,实现新闻阅览器

    c#泛型类、泛型方法、泛型接口、泛型委托

    c#泛型类、泛型方法、泛型接口、泛型委托

    C# 泛型的好处讲解

    C# 泛型的好处C# 泛型的好处C# 泛型的好处

    C#泛型,非泛型实现枚举

    C#泛型,非泛型实现枚举功能,通过实现接口方法或者使用迭代器块实现

    C# 泛型接口的抗变和协变

    1, 泛型接口的协变 如果泛型类型用out关键字标注,泛型接口就是协变的。这也意味着返回类型只能是T。 泛型接口的抗变 如果泛型类型用in关键字标注,泛型接口就是抗变的。这样,接口只能把泛型类型T用作其方法的输入...

    深入解析C#中的泛型类与泛型接口

    主要介绍了C#中的泛型类与泛型接口,对泛型的支持是C#语言的重要特性,需要的朋友可以参考下

    C#泛型学习实例

    C#泛型学习实例 里面包括泛型类,泛型方法,泛型接口,泛型抽象类,泛型抽象方法等多种泛型使用实例

    C#创建 TInterface泛型接口实例

    摘要:C#源码,文件操作,TInterface,创建泛型接口 C#创建或使用一个 TInterface泛型接口的源码实例,大致实现的思路:创建一个泛型接口public interface IGenericInterface,接口中调用CreateInstance方法,实现上面...

    对DAL数据访问层的封装,一个泛型接口,一个实现泛型接口的父类

    对DAL数据访问层的封装,一个泛型接口,一个实现泛型接口的父类,泛型父类实现了对某个表的增删改查,用EF技术实现

    C# System.Collections 非泛型接口方法解析.pdf

    泛型接口的实现与非泛型接口的实现的方式相似,免费下载,欢迎支持,正在做 C# 的各集合类型的内部实现,你的支持是我的动力, 谢谢

    C# 泛型数组学习小结

    C# 泛型和数组在 C# 2.0 中,下限为零的一维数组自动实现 IList。这使您可以创建能够使用相同代码循环访问数组和其他集合类型的泛型方法。此技术主要对读取集合中的数据很有用。IList&lt;T&gt; 接口不能用于在数组中添加或...

    C#泛型实例详解

    本文以实例形式讲述了C#泛型的用法,有助于读者深入理解C#泛型的原理,具体分析如下: 首先需要明白什么时候使用泛型: 当针对不同的数据类型,采用相似的逻辑算法,为了避免重复,可以考虑使用泛型。 一、针对类的...

    C#泛型详解由入门到精通.docx

    目录 1. 泛型简介 2 1.1.理解泛型 2 1.2.泛型简介 3 2.泛型的优点 3 3.泛型类型参数 4 4.类型参数的约束 5 ...6.泛型接口 11 7.泛型方法 13 8.泛型委托 15 9.泛型代码中的默认关键字 17 10.泛型和属性 18

    .NET/C#如何判断某个类是否是泛型类型或泛型接口的子类型详解

    主要给大家介绍了关于.NET/C#如何判断某个类是否是泛型类型或泛型接口的子类型的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧

    C#泛型详解。doc

    学习c#者必读之物,本书详细的讲解了c#的泛型的特性和应用。通过泛型类可以创建独立于类型的类,泛型方法是独立于类型的方法。接口、结构和委托也可以用泛型的方式创建。泛型引入了一种新的编程方式

    C# 泛型的约束

    表示对于的约束必须为一个类(引用类型)不能是值类型(int,char,datatime,struct),可以是接口interface 区分,数组为引用类型,因为定义数组时需要new出一个对象。 虽然定义成 RefSample&lt;T&gt; 传入的必须为引用...

Global site tag (gtag.js) - Google Analytics