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,给出错误提示:

       “请给出正确的半径值!”

 

posted @ 2019-09-10 19:55  Winward_King  阅读(538)  评论(0编辑  收藏  举报