C# 枚举
枚举
day 12 2018.01.17. 周三
Role
--Maigc
--soldier
Team
Test
分析: 游戏树V1.0
在这个案例中,是集合了封装、继承、多态的综合案例。
--------------------------------------------------------------
1.封装体现在:设计4个实体类时,这4个类中的字段和方法进行限制。
Role -- 角色类
Magic --魔法师类
soldier --战士类
要求:类中的字段私有化,然后为私有化字段添加标准属性。
方法公开化,然后添加构造方法。
2.继承体现在:
Role ---- 角色类,父类
Magic ---- 魔法师角色,子类
soldier --- 战士角色, 子类
要求:Role类中定义了角色名称,定义了进攻的方法
战士类和魔法师类继承了角色类,重写了Role类中的Attack()方法。
另外,使用了 :base( roleName )显示的调用父类含有一个参数构造
方法为父类的 roleName 字段赋值。
4. 多态体现在:
设计 Team 类
Team 类中的成员:
1) 一个Role类型的数组,存储团队中的多名不同的角色
注:该数组既可以存储魔法师成员,又可以接收战士角色的成员
最多只能包含6个成员,如果超过,给出错误提示。
2) void AddMemeber( Role r )
该方法用于向Role数组中添加角色成员。
这里的参数为 Role 类型,这样保证了只要使用父类变量指向
子类对象的方式创建对象,将对象传给 参数 r时,r就能正常
接收。也就是:r 保证了可以接收多种类型的角色(魔法师或战
3) int AttackSum():获取整个团队中的总伤害值
该方法中遍历Role数组,获取数组中每个角色成员对敌人的
进攻伤害值,所有角色成员伤害值相加,就是最后结果。
遍历 Role数组时,使用数组中的每个元素调用 Attack()
会根据具体 角色 来 选择执行Attack()
当数组成员为Magic时,且Magic中重写了父类的Attack()
方法,那么编译器会执行Magic类中的Attack(),而不会执行
父类Role类中的Attack();
同样,如果角色成员 为soldier时,且soldier 重写了Attack()
会调用子类自己的Attack()方法。
最后:要求组建一个团队,并创建多个成员,然后将成员通过
AddMember()方法添加到团队中。添加之后,调用
AttackSum()方法,计算整个团队进攻时,整个团队的
整体攻击伤害值。
补充功能:
为 Magic 类和 soldier 类添加新的内容:
1)Magic 添加一个表示魔法等级的字段,字段类型为int, level
要求字段私有化, 并添加标准属性。
魔法等级应该在:1-10之间,“不合法的魔法等级”,并为
level 设置默认值 1.
2)修改Attack()方法,魔法师的Attack()方法: 魔法等级 * 5
3)添加无参数和含有两个参数构造方法(名字和魔法等级)
----------------------------------------------------------
1)solider 添加一个表示战士伤害值的字段,字段类型为int,hurt
要求字段私有化, 并添加标准属性。
伤害值等级应该在:1-20之间,“不合法的伤害值”,并为
hurt 设置默认值 1.
2)修改 Attack()方法,战士的Attack()方法: hurt 字段的值
3)添加无参数和含有两个参数构造方法
测试,创建团队,团队中添加成员。求出整个团队的进攻伤害值。
v01: 第一个版本
v02: 第二个版本
---------------------------------------------------------------
枚举
值类型
1.简单类型(13种)
2.enum 枚举类型
3.
引用类型
1.枚举类型
enum 枚举名
{
枚举项1,
枚举项2,
枚举基3
.....
}
2. 什么是枚举类型?
也是C#中的一种数据类型,
表示的一组规律性的数据.
通常使用enum关键字来自定义一种枚举类型.
如:从 一月到十二月 表示与月份相关的内容
从 周一到周日 表示与星期相关的内容
表示性别构成的一种枚举类型
1.枚举名
2.枚举项
比如:定义一个表示性别的枚举类型.包含两个枚举项:男和女
1.当前枚举的枚举名是什么? ColorEnum
1) 有几个枚举项? 5个
2) 枚举项的名字是什么? Red,Yellow,Blue,Green,Black
3) 每个枚举项都是什么类型的? int 类型
--定义枚举类型时,如果没有在枚举类型的名字
后面使用:类型,那么默认是int类型.
--8种整数的都可以
4) 每个枚举项的名字是什么? 每个枚举项的值是什么?
Red: 第一个枚举项的名字,对应的值: 0
Yellow:第二个枚举项的名字,对应的值:1
Blue: 第三个枚举项的名字,对应的值: 2
......
后面每个枚举项的值默认都是 n + 1
5)如果想获取 "Blue" 这个枚举项,代码为:
枚举类型的名字.枚举项名字
ColorEnum . Blue ---- 打印结果: Blue
ColorEnum value1 = ColorEnum . Blue--打印Blue
6)如果想获取"Black"这个枚举项对应的具体值,代码为:
( int ) ColorEnum . Black ; // 4
int value = (int) ColorEnum.Black ;
注:强制转成int类型,是因为定义ColorEnum类型时没有
指定枚举项的类型,所以默认是int.
如果指定了其它的,就要转换为其它的类型.
定义了一个跟颜色相关的枚举类型,
enum ColorEnum
{
Red, //0
Yellow,//1
Blue, //2
Green, //3
Black //4
}
枚举总结:
FTP 上
PPT 文件夹中有一个"微软官方知识点截图" 文件夹,
里面是C#官方对 枚举\结构\数组 等知识点的官方介绍
打开后,滚动鼠标滚轮即可放大图片查看.
练习:
定义一个表示的月份相关的枚举类型,名字:MonthType
MonthType 中包含了12个枚举项,枚举项是byte类型.
枚举项的名字: Jan,Fer,Mar,Apr,May,Jun,Jul,Aug,Spe,
Oct,Nov,Dec
然后定义一个方法,ChooseMonth( MonthType value )
将上面定义好的枚举类型作为方法法的参数.
方法体中根据括号中传过来的参数,打印对应的月份
或月份特点.
分析:
1.定义一个枚举类型 --- 单独的类
2.定义一个测试类, 添加一个方法:ChooseMonth(...)
添加Main()....
代码详见:DAY12_02_enum 项目下 LianXi2 文件夹
---- MonthType.cs -- 枚举类型
---- Test.cs -- 测试类
-------------------------------------------------------
总结:关于枚举
1. 枚举也是一种数据类型,和int,byte等是一样的
2. 通常都是自定义一个枚举类型,然后添加多个有规律性的枚举项
3. 枚举类型中的每个枚举项都是一个常量值
4. 默认情况下,如果没有指定枚举项的类型,默认为 int类型,第一个枚举项的值默认为0,后面依次加1
5. 如果要手动指定枚举项的类型,需要在定义枚举时指定。
如:enum 枚举名 : byte
6. switch..case 代码中,也可以使用枚举作为switch的参数
7. 枚举项作为数据类型,
class Person --- 人的性别时
out ref params
1.out 输出参数
1) 用来修改方法的参数的
2) 基本语法:
1. 在Main()方法中 定义变量,变量赋值,
交给Show()方法赋值,
//第一处:调用Show()方法时,变量名前out
Show( out number )
2. Show()方法定义的代码处,也要加out修饰
// 第二处:定义Show()
public void Show( out int number )
{
}
练习
创建一个类, OutTest.cs
方法: GetCalResult( a,b ),用于完成a和b两个数
的基本运算(加,减,乘,除)
要求: 调用该方法时,使用out关键字,实现 GetCalResult(....)
有多个结果返回。
总结:
1. out 修饰谁??? --- 方法参数
2. 在 out 关键字时,关键字应该写到哪里去? 2处
3. out 关键字的作用有哪些?
1) 将未赋值的变量作为参数传递
2) 实现一个返回值为void的方法
可以实现一次性返回多个数据
-------------------------------------------------------
ref 引用参数
注:ref 修饰的变量在作为参数传递时,
一定要提前赋值,不赋值会报错。
作用:ref 传递时,传递的是变量的地址,
所以在不同的方法中操作参数时,
另外一个方法中的数据会受影响。
----------------------------------------------------
params
用于修饰数组或容器类型的数据,
当方法的参数需要一个数组类型时,
正常情况下,调用该方法必须提供一个数组类型的参数
但是有时候,确实没有准备好数组或确实不明确知道数组
中的元素内容,这时,就可以在定义方法时,在方法参数
类型前面加params 修饰符。
这样,再调用方法时,就可以不用传递一个数组类型的
数据了,可以直接是几个对应类型的值,
会自动放到数组中。
day 12 2018.01.17. 周三 作业
必做题:
在 游戏树V1.0 项目的基础之上,修改Role角色类,
要求:
在Role 中添加一个表示角色性别的枚举类型,枚举名字,RoleType,
包含两个枚举项: boy, girl .
1) 为Role类添加三个参数的构造方法
2) 为角色性别 这个字段添加属性
3) 创建魔法师类,战士类,团队类,.....(和之前一样)
4) 创建一个测试类,要求测试类创建多名角色时,要指定性别
最后测试.
.... 最后调用 AttackSum()
2. 考查枚举类型的应用(必做题)
定义一个表示游戏角色的枚举,名:EnumRoleType
枚举项的类型:byte类型.
包含了3个枚举项:magic,solider,knight
3. ref关键字的使用:
定义一个方法:Swap( string name1, string name2 ) ,
该方法用于交换两个学员的名字.
要求:在Main()方法中调用该方法,并使用ref关键字
4.介绍了多态之后,继续修改你的代码
单选题和多选题中.要求:创建试题时,使用父类变量指向子类对象的形式创建对象
并创建数组存储.随机显示一道试题.
---------------------------------------------------------------
作业描述(选做题) --- 考查:将一个类型作为另外一个类的字段
1.创建一个“点”类,类名为 Point.cs,类中包含的内容:
--字段:x, y ( int类型 )
--方法:
-构造方法:无参数、2个参数
-求两点间距离的方法(共2个,这2个构成方法重载)
double Distance( Point p )
double Distance( int x, int y )
2.创建一个“圆”类,类名为 Circle.cs,类中包含的内容:
--字段:圆心(Point类型的),半径(float --radius )
--方法
-构造方法:无参数,其它参数
public Circle( Point p ) {......}
public Circle( int x , int y, double radius ){......}
-计算圆的周长和面积的方法,分别为:
double GetLength( ) ---周长
double GetArea( ) ---面积
-给定一个点,判断当前圆是否包含这个指定的点
bool Contains( Point p )
-给定 x,y两个坐标数字,判断当前圆是否包含这两个坐标为x,y的数字
bool Contains( int x, int y )
要求:两个类中的所有字段私有化,方法公开化。然后为私有化的字段
提供对应的标准属性。
2)在为“圆”类表示半径的字段 radius 添加属性时,要求在属性中
添加对半径值的判断:如果半径小于-10或大于10,给出错误提示:
“请给出正确的半径值!”