泛型种树(generic) 代码
再这个案例中我们,为什么要使用泛型约束
使用约束的原因 约束指定类型参数的功能和预期。 声明这些约束意味着你可以使用约束类型的操作和方法调用。 如果泛型类或 方法对泛型成员使用除简单赋值之外的任何操作或调用 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) 代码的更多相关文章
- C#:泛型(Generic)
前言: 此系列都为个人对C#的回顾,属于个人理解,新司机可参考.求老司机指点.如果有什么问题或不同见解,欢迎大家与我沟通! 目录: 泛型是什么 泛型的好处及用途 如何声明使用泛型 泛型类 泛型方法 ...
- 泛型(Generic)委托
泛型(Generic)委托 您可以通过类型参数定义泛型委托.例如: delegate T NumberChanger<T>(T n); 下面的实例演示了委托的使用: using Syste ...
- c# 泛型(Generic)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 泛型 { ...
- 谈一谈泛型(Generic)
谈一谈泛型 首先,泛型是C#2出现的.这也是C#2一个重要的新特性.泛型的好处之一就是在编译时执行更多的检查. 泛型类型和类型参数 泛型的两种形式:泛型类型( 包括类.接口.委托和结构 没有泛型枚 ...
- 泛型(Generic)
本质:限制集合类型 我们在编写泛化类的时候,我们要时刻提醒自己,我们传入的参数T仅仅是一个Object类型,任何具体类型信息我们都是未知的. 小例子: package day02.generic; i ...
- 雷林鹏分享:C# 泛型(Generic)
C# 泛型(Generic) 泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候.换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法 ...
- 【泛型】Generic 参数化类型 类型转换
参考: http://blog.csdn.net/lonelyroamer/article/details/7864531#comments http://blog.csdn.net/lonelyro ...
- 【第7篇】TypeScript泛型的案例代码具体解释
8.1最简单泛型样例 Ts代码 /** * 没有泛型,我们要么必须给身份功能的特定类型 */ function identity1(arg: number): number { return arg; ...
- C#进阶之泛型(Generic)
1.泛型 泛型是framwork2.0推出的新语法,具有延迟声明的特点:把参数类型的声明推迟到调用的时候.泛型不是一个语法糖,是框架升级提供的功能.需要编辑器和JIT(just-in-time com ...
随机推荐
- javascript 获取<td>标签内的值。
当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. 通过可编程的对象模型,JavaScript 获得了足够的能力来 ...
- Floodlight+Mininet的SDN实验平台搭建初探
平台环境说明: Cpu:Intel Core 2 Duo T6570 Mem:4.00GB Os :Ubuntu 14.04 1.Floodlight Floodlight是一个比较成熟的sdn控制器 ...
- Go 转义字符及风格
今天来学习一下Go 中的转义字符,源码注释,规范的代码风格以及标准库API 文档; Go 转义字符常用的转义字符有以下几个:1. \t: 表示一个制表符(tab), 通常可以使用它进行排版; 2. \ ...
- linux关闭swap
#(1)临时关闭swap分区, 重启失效; swapoff -a #(2)永久关闭swap分区 sed -ri 's/.*swap.*/#&/' /etc/fstab 也可以在sysctl.c ...
- MySQL表空间结构
在Innodb中,我们可以指定一张表的数据是保存在独立表空间还是系统表空间,这个参数是:innodb_file_per_table 如果我们设置这个参数的值为0,那么一个表将使用系统表空间来保存表的数 ...
- lambda表达式的学习
Lambda表达式 为什么使用lambda表达式 Lambda表达式可以简化我们的代码,使我们只需要关注主要的代码就可以. //测试用的实体类 public class Employee { priv ...
- 3. scala-spark wordCount 案例
1. 创建maven 工程 2. 相关依赖和插件 <dependencies> <dependency> <groupId>org.apache.spark< ...
- Xmind8破解教程
Windows下Xmind8破解教程 破解步骤: 1. 首先去xmind国外官网下载对应操作系统的安装包,国内官网的那个是有残缺的,不支持破解. 点击打开链接 通过zip格式下载,别下载exe,不然找 ...
- action标签中method={1}怎么理解
其实用到method={数字}的时候,相应的前面的action是要出现*通配符来搭配的.比如一个小例子:<action name="user_*" class="U ...
- 用JavaScript+HTML实现双色球随机摇号效果
用JavaScript+HTML实现双色球随机摇号效果 首先要知道双色球的规则是什么 双色球投注区分为红球号码区和蓝球号码区 红球号码范围为01-33,蓝球号码范围为01-16 双色球每期从33个红球 ...