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

使用约束的原因 约束指定类型参数的功能和预期。 声明这些约束意味着你可以使用约束类型的操作和方法调用。 如果泛型类或 方法对泛型成员使用除简单赋值之外的任何操作或调用 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. javascript 获取<td>标签内的值。

    当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. 通过可编程的对象模型,JavaScript 获得了足够的能力来 ...

  2. Floodlight+Mininet的SDN实验平台搭建初探

    平台环境说明: Cpu:Intel Core 2 Duo T6570 Mem:4.00GB Os :Ubuntu 14.04 1.Floodlight Floodlight是一个比较成熟的sdn控制器 ...

  3. Go 转义字符及风格

    今天来学习一下Go 中的转义字符,源码注释,规范的代码风格以及标准库API 文档; Go 转义字符常用的转义字符有以下几个:1. \t: 表示一个制表符(tab), 通常可以使用它进行排版; 2. \ ...

  4. linux关闭swap

    #(1)临时关闭swap分区, 重启失效; swapoff -a #(2)永久关闭swap分区 sed -ri 's/.*swap.*/#&/' /etc/fstab 也可以在sysctl.c ...

  5. MySQL表空间结构

    在Innodb中,我们可以指定一张表的数据是保存在独立表空间还是系统表空间,这个参数是:innodb_file_per_table 如果我们设置这个参数的值为0,那么一个表将使用系统表空间来保存表的数 ...

  6. lambda表达式的学习

    Lambda表达式 为什么使用lambda表达式 Lambda表达式可以简化我们的代码,使我们只需要关注主要的代码就可以. //测试用的实体类 public class Employee { priv ...

  7. 3. scala-spark wordCount 案例

    1. 创建maven 工程 2. 相关依赖和插件 <dependencies> <dependency> <groupId>org.apache.spark< ...

  8. Xmind8破解教程

    Windows下Xmind8破解教程 破解步骤: 1. 首先去xmind国外官网下载对应操作系统的安装包,国内官网的那个是有残缺的,不支持破解. 点击打开链接 通过zip格式下载,别下载exe,不然找 ...

  9. action标签中method={1}怎么理解

    其实用到method={数字}的时候,相应的前面的action是要出现*通配符来搭配的.比如一个小例子:<action name="user_*" class="U ...

  10. 用JavaScript+HTML实现双色球随机摇号效果

    用JavaScript+HTML实现双色球随机摇号效果 首先要知道双色球的规则是什么 双色球投注区分为红球号码区和蓝球号码区 红球号码范围为01-33,蓝球号码范围为01-16 双色球每期从33个红球 ...