• 面向对象设计——“泛型”的起步


            泛型是 2.0 版 C# 语言和公共语言执行库 (CLR) 中的一个新功能。泛型将类型參数的概念引入 .NET Framework,类型參数使得设计例如以下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到client代码声明并实例化该类或方法的时候。比如,通过使用泛型类型參数 T,您可以编写其它client代码可以使用的单个类,而不致引入执行时强制转换或装箱操作的成本或风险。

    ——MSDN


            我的计算机是以Visual Basic 6.0拉开帷幕的。让我印象比較深的是两个排序:选择排序和冒泡排序。当然本文不是来讨论这两个排序的详细实现。更不讨论差别。那要干吗呢?请往下看。


            对于选择排序。完毕从小到大的排序。我们要怎么实现功能呢?对于当时的我,肯定毫不犹豫的写出以下的代码。由于课本中就是这种实现思路:

        public class SelectionSort
        {
            public void Sort(int[] array)
            {
                int length = array.Length;
    
                for (int i = 0; i < length - 1; i++)
                {
                    for (int j = i + 1; j < length; j++)
                    {
                        // 对两个元素进行交换
                        if (array[i] > array[j])
                        {
                            int temp = array[i];
                            array[i] = array[j];
                            array[j] = temp;
                        }
                    }
                }
            }
        }
            我们来測试一下:
            static void Main(string[] args)
            {
                SelectionSort sorter = new SelectionSort();
                int[] array = { 5, 2, 0, 1, 3, 1, 4 };
                sorter.Sort(array);
                foreach (int i in array) Console.Write(i + " ");
                Console.WriteLine();
                Console.Read();
            }
            输出结果:0 1 1 2 3 4 5
            非常不错,比較easy实现了功能。

    再看看上面的代码,我们实现的是对int类型数据的排序,假设我们换成byte该怎么弄呢?对于VB6.0中。他们是全然兼容的。由于VB6.0可以自己主动进行隐式转换,但C#是一个强类型的语言,无法在一个接受int数组类型的地方传入一个byte数组。

    事实上也不难。我们仅仅须要复制一下代码,然后改一下參数类型就OK了:

        public class SelectionSort
        {
            public void Sort(byte[] array)
            {
                int length = array.Length;
    
                for (int i = 0; i < length - 1; i++)
                {
                    for (int j = i + 1; j < length; j++)
                    {
                        // 对两个元素进行交换
                        if (array[i] > array[j])
                        {
                            byte temp = array[i];
                            array[i] = array[j];
                            array[j] = temp;
                        }
                    }
                }
            }
        }
            不能高兴的太早,如今又有新需求了,须要对一个char类型的数据进行排序,当然我们能够继续依照上面的思路,採用复制粘贴,然后改一下数据类型。这里就不写代码了!


            我们细致地对照这几个实现方法,会发现方法的实现全然一样,除了方法的签名不同以外,没有不论什么的差别。但是完毕这三个功能,代码的反复度、代码的冗余相当大。对于编程这但是不好味道。

    那么有没有一种机制,或者说有这样一个keyword。来取代不论什么类型呢?我们如果有这样一个关系字叫“T”:

        public class SelectionSort
        {
            public void Sort(T[] array)
            {
                int length = array.Length;
    
                for (int i = 0; i < length - 1; i++)
                {
                    for (int j = i + 1; j < length; j++)
                    {
                        // 对两个元素进行交换
                        if (array[i] < array[j])
                        {
                            T temp = array[i];
                            array[i] = array[j];
                            array[j] = temp;
                        }
                    }
                }
            }
        }
            啊。这效果看起来怎一个“爽”字了得。当然上面的代码是错误的,C#会报错的。到如今,也用不着卖乖了。C#已经帮我们实现了这样的效果。那就是泛型。

    在.Net中。实现比較的基本方法是实现IComparable接口:

        public class SelectionSort
        {
            public void Sort<T>(T[] array) where T : IComparable
            {
                int length = array.Length;
                for (int i = 0; i < length - 1; i++)
                {
                    T min = array[i];
                    int minIndex = i;
                    for (int j = i + 1; j < length; j++)
                    {
                        if (min.CompareTo(array[j]) > 0)
                        {
                            min = array[j];
                            minIndex = j;
                        }
                    }
                    if (minIndex != i)
                    {
                        array[minIndex] = array[i];
                        array[i] = min;
                    }
                }
            }
        }

            这是泛型的一个最典型的应用。能够看到,通过使用泛型。我们极大地降低了反复代码,使我们的程序更加清爽,泛型类就类似于一个模板,能够在须要时为这个模板传入不论什么我们须要的类型。

  • 相关阅读:
    LINQ to SQL 模拟实现 ROW_NUMBER() OVER(ORDER BY ...) 的功能
    TCP粘包、拆包与通信协议
    Decoder和Encoder
    Future 和 ChannelFuture
    通道Channel
    通道初始化器ChannelInitializer
    数据处理器ChannelHandler
    通道配置项 ChannelOption
    ChannelPipeline
    启动配置类Bootstrap 和 ServerBootstrap
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7294301.html
Copyright © 2020-2023  润新知