zoukankan      html  css  js  c++  java
  • 泛型接口的实现和调用

    一,什么是泛型?

    泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。在.NET类库中处处都可以看到泛型的身影,尤其是数组和集合中,泛型的存在也大大提高了程序员的开发效率。

    二,泛型的优点:

    1>当在一个功能模块实现就是同一种方法,而类型不同导致系统实现多次的拆箱和装箱的操作,这将在托管堆上分配和回收大量的变量,若数据量大,则性能损失非常严重。 在处理引用类型时,虽然没有装箱和折箱操作,但将用到数据类型的强制转换操作,增加处理器的负担,而泛型刚好可以解决这个问题

    2>使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。

    3>在MSDN中用ArrayList的代码介绍非泛型时的缺点,地址:https://msdn.microsoft.com/zh-cn/library/b5bx6xee.aspx:

    在公共语言运行时和 C# 语言的早期版本中,通用化是通过在类型与通用基类型 Object 之间进行强制转换来实现的,泛型提供了针对这种限制的解决方案。 通过创建泛型类,您可以创建一个在编译时类型安全的集合。

    使用非泛型集合类的限制可以通过编写一小段程序来演示,该程序使用 .NET Framework 类库中的 ArrayList 集合类。 ArrayList 是一个使用起来非常方便的集合类,无需进行修改即可用来存储任何引用或值类型。

     // The .NET Framework 1.1 way to create a list:
                System.Collections.ArrayList list1 = new System.Collections.ArrayList();
                list1.Add(3);
                list1.Add(105);
    
                System.Collections.ArrayList list2 = new System.Collections.ArrayList();
                list2.Add("It is raining in Redmond.");
                list2.Add("It is snowing in the mountains.");

    但这种方便是需要付出代价的。 添加到 ArrayList 中的任何引用或值类型都将隐式地向上强制转换为 Object。 如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。 强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显

    三,在使用泛型处理类似情况,客户端代码基于每个实例指定这些类要使用的具体数据类型的方式。这样将不再需要向上强制转换为 T:System.Object,同时,也使得编译器可以进行类型检查。这样增强了代码的通用性和减少代码的重复性。例子如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace InterfaceTdemo
    {
        //定义泛型接口
        public interface ISay<T, U> where T : class
        {
            void SpeakEn(T t);
    
            void SpeakCh(U u);
        }
    
        //定义实体类
        public class English
        {
            public string Content { get; set; }
        }
    
        //定义实体类
        public class Chinese
        {
            public string Content { get; set; }
        }
        //定义实体类
        public class English2
        {
            public string Content { get; set; }
        }
    
        //定义实体类
        public class Chinese2
        {
            public string Content { get; set; }
        }
    
        //实现泛型接口中的方法
        public class Say : ISay<English, Chinese>    //继承并实现接口
        {
            public void SpeakEn(English en)
            {
                Console.WriteLine(en.Content);
            }
    
            public void SpeakCh(Chinese ch)
            {
                Console.WriteLine(ch.Content);
            }
        }
    
        //实现泛型接口中的方法2
        public class Say2 : ISay<English2, Chinese2>    //继承并实现接口
        {
            public void SpeakEn(English2 en)
            {
                Console.WriteLine(en.Content);
            }
    
            public void SpeakCh(Chinese2 ch)
            {
                Console.WriteLine(ch.Content);
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                English en = new English();
                en.Content = "English";
                Chinese ch = new Chinese();
                ch.Content = "中文";
                English2 en2 = new English2();
                en2.Content = "English2";
                Chinese2 ch2 = new Chinese2();
                ch2.Content = "中文2";
    
                //通过传不同的类型实现调用不同的方法,分别调用相同接口不同类型的实现方法
                ISay<English, Chinese> Is = new Say();
                Is.SpeakCh(ch);
                Is.SpeakEn(en);
    
                ISay<English2, Chinese2> Is2 = new Say2();
                Is2.SpeakCh(ch2);
                Is2.SpeakEn(en2);
            }
        }
    }

     综上:

    1》与 ArrayList 相比,使用泛型就是添加的唯一语法是声明和实例化中的类型参数,ISay<English2, Chinese2> Is2 = new Say2();而这类型参数就是你自己传过去

    2》泛型编程的思想:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。

  • 相关阅读:
    【Python】【解决】UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 1: ordinal not in range(128)
    【小技巧】强制重启无线网卡,解决“区域中找不到无线网络,请确定您计算机上的无线开关已启用”问题
    【小技巧】9针USB转串口简易连通性测试,附25针转9针
    【ACM】HDU1008 Elevator 新手题前后不同的代码版本
    【Android】命令行jarsigner签字和解决找不到证书链错误
    LeetCode 【47. Permutations II】
    LeetCode 【46. Permutations】
    Python asyncio库的学习和使用
    LeetCode 【190. Reverse Bits】
    LeetCode 【21. Merge Two Sorted Lists】
  • 原文地址:https://www.cnblogs.com/May-day/p/6379328.html
Copyright © 2011-2022 走看看