再这个案例中我们,为什么要使用泛型约束

使用约束的原因 约束指定类型参数的功能和预期。 声明这些约束意味着你可以使用约束类型的操作和方法调用。 如果泛型类或 方法对泛型成员使用除简单赋值之外的任何操作或调用 System.Object 不支持的任何方法,则将对类型参数应用 约束。 例如,基类约束告诉编译器,仅此类型的对象或派生自此类型的对象可用作类型参数。 编译器有了此保证 后,就能够允许在泛型类中调用该类型的方法。

案例来源:https://www.cnblogs.com/netbatman/p/10374072.html

实例使用泛型来种树(模拟下蚂蚁森林种树):

现在森林里可以种其他的树了(柠条,樟子松)。那我们添加2个类,修改People类,和Main方法,那有什么办法可以不修改People类的呢?

现在我们创建一个抽象类TreeBase:

    public abstract class TreeBase
{
public abstract string GetTreeName();
public abstract int needEnergy();
} public class SuosuoTree: TreeBase
{
//种植梭梭树需要的能量
public override int needEnergy()
{
return 17900;
}
public override string GetTreeName()
{
return "梭梭树";
}
} public class NingTiaoTree : TreeBase
{
//种植柠条需要的能量
public override int needEnergy()
{
return 16930;
}
public override string GetTreeName()
{
return "柠条";
}
} public class ZhangZiSongTree : TreeBase
{
//种植樟子松需要的能量
public override int needEnergy()
{
return 146210;
}
public override string GetTreeName()
{
return "樟子松";
}
} 复制代码 重新构造后的People:修改后添加了新的树苗,就不用修改People类了。
复制代码 public class People
{
//姓名
public string name { get; set; } //能量
public int energy { get; set; } public void Plant<T>(T tree) where T:TreeBase
{
if(energy< tree.needEnergy())
{
Console.WriteLine("能量不足");
}
else
{
energy = energy- tree.needEnergy();
Console.WriteLine($"恭喜{name},{tree.GetTreeName()}种植成功,获得成就!!");
}
}
} 复制代码

小明也可以种不同的树了:

    class Program
{
static void Main(string[] args)
{
People xiaoming = new People
{
name = "小明",
energy = 200000
}; xiaoming.Plant(new SuosuoTree());
xiaoming.Plant(new NingTiaoTree());
xiaoming.Plant(new ZhangZiSongTree()); Console.WriteLine("剩余能量:"+xiaoming.energy); xiaoming.Plant(new ZhangZiSongTree()); Console.Read(); }
}

泛型种树(generic) 代码的更多相关文章

  1. C#:泛型(Generic)

    前言:  此系列都为个人对C#的回顾,属于个人理解,新司机可参考.求老司机指点.如果有什么问题或不同见解,欢迎大家与我沟通! 目录:  泛型是什么 泛型的好处及用途 如何声明使用泛型 泛型类 泛型方法 ...

  2. 泛型(Generic)委托

    泛型(Generic)委托 您可以通过类型参数定义泛型委托.例如: delegate T NumberChanger<T>(T n); 下面的实例演示了委托的使用: using Syste ...

  3. c# 泛型(Generic)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 泛型 { ...

  4. 谈一谈泛型(Generic)

    谈一谈泛型 首先,泛型是C#2出现的.这也是C#2一个重要的新特性.泛型的好处之一就是在编译时执行更多的检查. 泛型类型和类型参数 ​ 泛型的两种形式:泛型类型( 包括类.接口.委托和结构 没有泛型枚 ...

  5. 泛型(Generic)

    本质:限制集合类型 我们在编写泛化类的时候,我们要时刻提醒自己,我们传入的参数T仅仅是一个Object类型,任何具体类型信息我们都是未知的. 小例子: package day02.generic; i ...

  6. 雷林鹏分享:C# 泛型(Generic)

    C# 泛型(Generic) 泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候.换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法 ...

  7. 【泛型】Generic 参数化类型 类型转换

    参考: http://blog.csdn.net/lonelyroamer/article/details/7864531#comments http://blog.csdn.net/lonelyro ...

  8. 【第7篇】TypeScript泛型的案例代码具体解释

    8.1最简单泛型样例 Ts代码 /** * 没有泛型,我们要么必须给身份功能的特定类型 */ function identity1(arg: number): number { return arg; ...

  9. C#进阶之泛型(Generic)

    1.泛型 泛型是framwork2.0推出的新语法,具有延迟声明的特点:把参数类型的声明推迟到调用的时候.泛型不是一个语法糖,是框架升级提供的功能.需要编辑器和JIT(just-in-time com ...

随机推荐

  1. pytest文档4-fixture之conftest.py

    用例1需要先登录,用例2不需要登录,用例3需要先登录.很显然这就无法用setup和teardown来实现了.fixture之conftest.py就是自定义测试用例的预置条件 1.firture相对于 ...

  2. vue3源码node的问题

    下载vue3源码后,下载依赖时,node的版本需要在10.0.0以上,并且不同的vue3里面的插件的配置对版本依赖还不同,14.0.0以上的版本基本都不支持win7了, win7系统可以安装12.0. ...

  3. Gradle下载安装教程

    前言 1.gradle和maven一样都是用来构建java程序的,maven2004年开始兴起,gradle2012年开始诞生,既然已经有了maven这么成熟的构建工具为什么还有gradle的诞生呢, ...

  4. 【webpack4.0】---base.config.js基本配置(五)

    一.创建项目初始化 1.初始化项目npm init -y 2.创建 src (用来存放开发环境的代码)文件夹.  config (用来存放webpack的配置项)文件夹 3.安装webpack  We ...

  5. vivo数据库与存储平台的建设和探索

    本文根据Xiao Bo老师在"2021 vivo开发者大会"现场演讲内容整理而成.公众号回复[2021VDC]获取互联网技术分会场议题相关资料. 一.数据库与存储平台建设背景 以史 ...

  6. linux不使用useradd添加新用户

    不使用useradd创建新的用户 1.进入用户特征信息:/etc/passwd 编辑: vim /etc/passwd 命令模式 :G 进入末行 进入编辑模式 :在最后添加新用户信息: 例:new_u ...

  7. Vue 之 Nginx 部署

    nginx 下载地址:http://nginx.org/en/download.html 下载后直接解压,cmd 进入到解压目录运行 start nginx 即可启动 常用命令: nginx -s s ...

  8. Android的基本资源引用(字符串、颜色、尺寸、数组)【转】

    感谢大佬:https://blog.csdn.net/wenge1477/article/details/81295763 Android的基本资源引用(字符串.颜色.尺寸.数组)[转] 一.Andr ...

  9. Docker容器启动失败 Failed to start Docker Application Container Engine

    1.在k8s mster节点执行 1.kubectl get nodes 发现node节点没起来 [root@guanbin-k8s-master ~]# kubectl get nodes NAME ...

  10. Posix 信号

    转载请注明来源:https://www.cnblogs.com/hookjc/ 函数sem_open创建一个新的有名信号灯或打开一个已存在的有名信号灯.有名信号灯总是既可用于线程间的同步,又可以用于进 ...