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

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

——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

很不错,比较容易实现了功能。再看看上面的代码,我们实现的是对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类型的数据进行排序,当然我们可以继续按照上面的思路,采用复制粘贴,然后改一下数据类型。这里就不写代码了!

我们仔细地对比这几个实现方法,会发现方法的实现完全一样,除了方法的签名不同以外,没有任何的区别。但是完成这三个功能,代码的重复度、代码的冗余相当大,对于编程这可是不好味道。那么有没有一种机制,或者说有这样一个关键字,来代替任何类型呢?我们假设有这样一个关系字叫“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;
                }
            }
        }
    }

这是泛型的一个最典型的应用,可以看到,通过使用泛型,我们极大地减少了重复代码,使我们的程序更加清爽,泛型类就类似于一个模板,可以在需要时为这个模板传入任何我们需要的类型。

面向对象设计——“泛型”的起步,布布扣,bubuko.com

时间: 2024-10-27 07:58:00

面向对象设计——“泛型”的起步的相关文章

面向对象设计——泛型的愉快体验

在实际的项目中,我们经常看到有人写了很多代码,抽象了很多类,而这些类无不是采用了泛型和委托,应用了这辆种技术后,经常有人给我们说,代码的复用性和耦合性就降低了,那作为一个合格的面向对象的程序设计人员,这种技术成为了我们的必备技能,今天就跟着我一起来一次轻松愉快的旅行! 定义(如果吃力,请直接看我对他的注解): 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定 义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参

面向对象设计——协变与逆变

在面向对象的设计中,我们一直追求一种结果,就是良好的复用性,基于这个理念,面向对象的设计中加入了协变与逆变(Covariance and Contravariance)两个概念,我们先来简单了解一下这两个概念. 简介: 协变:由子类向父类方向转变, 用out关键字标识 逆变:由父类向子类方向转变, 用in关键字 举例:Animal是父类,Dog是从Animal继承的子类:如果一个对象的类型是Dog,那么他必然是Animal.有一个获取宠物的方法要接受Dog参数,那么另一个接受Animal参数的方

Effective c++(笔记)之继承关系与面向对象设计

1.公有继承(public inheritance) 意味着"是一种"(isa)的关系 解析:一定要深刻理解这句话的含义,不要认为这大家都知道,本来我也这样认为,当我看完这章后,就不这样认为了. 公有继承可以这样理解,如果令class D以public 的形式继承了class B ,那么可以这样认为,每一个类型为D的对象同时也可以认为是类型为B的对象,但反过来是不成立的,对象D是更特殊化更具体的的概念,而B是更一般化的概念,每一件事情只要能够施行于基类对象身上,就一定可以应用于派生类对

7种面向对象设计的强大之处

凭什么要用面向对象来编程,不用是否可以?今天我们通过讲这么几个设计原则来说明为什么要用面向对象,它的好处在哪里. 一.单一职责原则: 全称:“Single-Responsibility Principle”面向对象设计 说明:就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因.所谓职责,我们可以理解他为功能,就是设计的这个类功能应该只有一个,而不是两个或更多.也可以理解为引用变化的原因,当你发现有两个变化会要求我们修改这个类,那么你就要考虑撤分这个类了.因为职责是变化的一个轴线,当需求

Java程序员应该了解的10个面向对象设计原则

面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator.Observer这样的设计模式,而不重视面向对象的分析和设计.甚至还有经验丰富的Java程序员没有听说过OOPS和SOLID设计原则,他们根本不知道设计原则的好处,也不知道如何依照这些原则来进行编程. 众所周知,Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计.查看Ap

设计模式2 面向对象设计原则

面向对象设计原则  原则的目的 面向对象设计原创表  单一职责原则案例 开闭原则 案例 依赖倒转原则 案例 面向对象设计原则  对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一.在面向对象设计中,可维护性的复用是以设计原则为基础的.每一个原则都蕴含一些面向对象设计的思想,可以从不同的角度提升一个软件结构的设计水平.  面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含

面向对象设计原则

七大原则:开闭原则.里氏代换原则.依赖倒转原则.合成/聚合复用原则.迪米特法则.接口隔离原则,单一职责原则. 开闭原则是面向对象的可复用的基石.其他六种原则是手段和工具. 各规则详细(本部分为转载) http://kb.cnblogs.com/page/214010/ 正如牛顿三大定律在经典力学中的位置一样,“开-闭”原则(Open-Closed Principle)是面向对象的可复用设计(Object Oriented Design或OOD)的基石.其他设计原则(里氏代换原则.依赖倒转原则.合

面向对象设计的SOLID原则

S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility Principle 单一责任原则 OCP The Open Closed Principle  开放封闭原则 LSP The Liskov Substitution Principle 里氏替换原则 DIP The Dependency Inversion Principle 依赖倒置原则 ISP The

软件工程概论第八章--面向对象设计

面向对象设计主要讲设计的概念.软件体系结构.系统设计.详细设计.应用设计模式.用户界面设计和设计文档等方面知识,面向对象的设计是面向对象技术中比较重要的阶段. 设计的概念中讲了设计活动和设计原则,设计是一个建模活动,此活动能实现从需求分析到软件实现间的跨越.设计原则主要有模块化.耦合度和内聚性和复用性,模块化可以使复杂的系统简化,耦合度和内聚性分别是子系统间的关联程度和系统内部的相关程度,降低耦合性提高内聚性.复用性利用以开发的软件元素生成新的软件系统. 软件体系结构主要有仓库体系结构,分层体系