有这样一个有关汽车的类。

    public class Car
    {
        public int ID { get; set; }
        public string Make { get; set; }
    }

现在,在客户端创建一个Car的集合实例,再遍历。

        static void Main(string[] args)
        {
            var car1 = new Car() {ID = 1, Make = "Ford"};
            var car2 = new Car() {ID = 2, Make = "Toyota"};

            var cars = new List<Car>(){car1,car2};

            foreach (var car in cars)
            {
                Console.WriteLine(car.Make);
            }

            Console.Read();

        }

现在,要为Car增加发动机。

不同的车系车型可能用不同的发动机。这些发动机应该有一个基类吧。

    public class MotorBase
    {
        public int HorsePower { get; set; }
        public string Name { get; set; }
    }

比如,有2种型号的发动机,分别继承基类MotorBase。

    public class V8 : MotorBase
    {
        public V8(string name)
        {
            HorsePower = 300;
            Name = name;
        }
    }

    public class V9 : MotorBase
    {
        public V9(string name)
        {
            HorsePower = 350;
            Name = name;
        }
    }

Car有可能用到V8发动机,也有可能V9发动机,这正是泛型登场的时候。

把Car修改成泛型类。

    public class Car<T>
    {
        public int ID { get; set; }
        public string Make { get; set; }
        public T Motor { get; set; }
    }    

这样,在创建Car<T>实例的时候,可以相对自如地选择V8或V9发动机。

        static void Main(string[] args)
        {
            var v8Car1 = new Car<V8>() {ID = 1, Make = "Ford",Motor = new V8("v8发动机")};
            var v8Car2 = new Car<V8>() { ID = 2, Make = "Toyota", Motor = new V8("v8发动机") };

            var v8Cars = new List<Car<V8>>
            {
                v8Car1, v8Car2
            };


            foreach (var car in v8Cars)
            {
                Console.WriteLine("品牌:{0},发动机:{1}",car.Make, car.Motor.Name);
            }

            Console.Read();

        }

由此,当针对不同的类型有相同行为的时候,正是泛型登场的时候。

一个例子来看C#泛型是如何登场的的更多相关文章

  1. 从一个例子中体会React的基本面

    [起初的准备工作] npm init npm install --save react react-dom npm install --save-dev html-webpack-plugin web ...

  2. Erlang 程序引发共享内存 bug 的一个例子

    虽然 Erlang 的广告说得非常好,functional.share-nothing.消息传递,blah blah 的,好像用 Erlang 写并发程序就高枕无忧了,但是由于 Erlang 信奉高度 ...

  3. 一个例子"入坑"布谷鸟算法(附完整py代码)

    布谷鸟是比较新的启发式最优化算法,但其与传统的遗传算法,退火算法等相比,被证明收敛速度更快,计算效率更高! 文章目录 本文诞生的缘由 布谷鸟算法思想简介 更新位置的方式 莱维飞行 局部随机行走 抛出个 ...

  4. spring笔记--使用springAPI以及自定义类 实现AOP的一个例子

    Spring的另一个重要思想是AOP,面向切面的编程,它提供了一种机制,可以在执行业务前后执行另外的代码,Servlet中的Filter就是一种AOP思想的体现,下面通过一个例子来感受一下. 假设我们 ...

  5. ReCap 360 photo照片建模技术的又一个例子

    这是我做的又一个利用Autodesk ReCap 360 照片建模技术做的一个例子.你可以下载模型自己把玩,或者下载原始照片自己试一试. 拍摄工具: 小米手机 照片数量:约120张 后期处理工具: p ...

  6. 用thinkphp写的一个例子:抓取网站的内容并且保存到本地

    我需要写这么一个例子,到电子课本网下载一本电子书. 电子课本网的电子书,是把书的每一页当成一个图片,然后一本书就是有很多张图片,我需要批量的进行下载图片操作. 下面是代码部分: public func ...

  7. 对Jena的简单理解和一个例子

    本文简单介绍Jena(Jena 2.4),使用Protégé 3.1(不是最新版本)创建一个简单的生物(Creature)本体,然后参照Jena文档中的一个例子对本体进行简单的处理,输出本体中的Cla ...

  8. 使用flume的一个例子

    新项目中需要使用到hadoop和vertica,使用flume把数据加载到hadoop中,我做了一个例子, 即监控一个sharefolder,如果里面有文件,则会文件load到hadoop. 开启Fl ...

  9. php部分--面向对象三大特性-封装(另加连续调用的一个例子)、继承(重写、重载的例子)、多态;

    一.封装性: 目的:为了使类更加安全. 做法:1设置私有成员 2在类中建方法,访问私有成员 3在方法里边加控制(if) 私有成员访问的两种方法: 方法一:set(可写) get(可读)做方法(可读可写 ...

随机推荐

  1. Linux系统基本命令

    要区分大小写 uname 显示版本信息(同win2K的 ver) dir 显示当前目录文件 ls -al 显示包括隐藏文件(同win2K的 dir) pwd 查询当前所在的目录位置 cd .. 回到上 ...

  2. Linux内存管理 【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-4491368.html Linux内存管理 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理 ...

  3. Eureka的自我保护模式

    一 Eureka的自我保护模式 进入自我保护模式最直观的体现就是Eureka Server首页的警告,如下图: 默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,E ...

  4. Android: 详解触摸事件如何传递

    当视图的层次结构比较复杂的时候,触摸事件的响应流程也变得复杂. 举例来说,你也许有一天想要制作一个手势极其复杂的 Activity 来折磨你的用户,你经过简单思索,认为其中应该包含一个 PageVie ...

  5. ldconfig命令与ldd命令

    ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令 ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令. ...

  6. Smarty 模板引擎简介

    前言 Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一.它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑 ...

  7. sqlmap工作流程图

  8. linux(CentOS) 下mysql自动备份

    1.创建并编辑文件 /usr/sbin/bakmysql.sh,命令: vi /usr/sbin/bakmysql.sh 内容如下: db_user="root" db_passw ...

  9. IdentityServer4使用EFCore生成MySql时的小bug

    EFCore生成PersistedGrantDbContextModelSnapshot的时候发现 b.Property<string>("Data") .IsRequ ...

  10. Linux系统运维笔记(二),Linux文件编辑命令

    Linux系统运维笔记 Linux文件编辑命令 首先我们使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式 接下来我们按i,然后键盘随便输入写内容. 然后按ESC重新进入到命令 ...