泛型种树(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 ...
随机推荐
- 比 WSL2 更香的是 Docker for windows!
今天给大家推荐一个软件 -- "Docker for windows": 如果你对WSL2,还不熟悉,可以关注公众号或小程序看看我之前推送过的两篇文章. Docker for wi ...
- 集合框架-工具类-Collection-toArray方法
1 package cn.itcast.p3.toolclass.arrays.demo; 2 3 import java.util.ArrayList; 4 import java.util.Arr ...
- 【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found -- The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
问题描述 使用NodeJS的后端应用,开发一个Mobile App的服务端,手机端通过REST API来访问获取后端数据.在本地编译好后,通过npm start启动项目,访问效果如下: 但是,当把项目 ...
- linux编译安装(全面教程解析)
目录 一:编译安装 1.编译安装特点 2.编译安装 简介 编译安装 1.使用源代码,编译打包软件 2,编译安装,只能按照源代码 一:编译安装 1.编译安装特点 1.可以自定制软件 2.按需求构建软件 ...
- 使用du与df命令查看磁盘容量不一致
在Linux系统的ECS实例中,执行du与df命令查看磁盘容量,出现不一致的现象 执行df -h命令查看文件系统的使用率,可以看到500G 执行du / -sh 命令只使用250G 执行du和df命令 ...
- WebSphere--WAS概念和原理解析
WebSphere--WAS概念和原理解析--tigergao收录于2021/04/25
- 学习JAVAWEB第十六天
今天做了一个简单的登陆界面,HTML+CSS太不熟悉了,明天还得接着做
- vue之keep-alive的使用
keep-alive:是vue内置的一个组件,可以使被包含的组件保留状态或避免重新渲染.有两个生命周期函数:activated.deachtivated.在vue 2.1.0版本后新增了两个属性:in ...
- 从我做起[AutoMapper实现模块化注册自定义扩展MapTo<>()].Net Core 之二
AutoMapper实现模块化注册自定义扩展MapTo<>() 我们都知道AutoMapper是使用的最多的实体模型映射,如果没有AutoMapper做对象映射那么我们需要想一下是怎么写的 ...
- UTF-8编码规则(摘自JDK官方文档)