C#面向对象思想深刻剖析

本文探讨了面向对象和面向过程的区别,强调了面向对象的封装、继承和多态特性,并通过石头、剪刀、布游戏举例说明如何运用面向对象思想设计Player、Computer和Judgement三个类。游戏规则中,玩家和电脑出拳,裁判根据双方出拳判断输赢,通过类的方法实现游戏逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象和面向过程区别:


1、面向过程程序设计方法的实质上是从计算机处理问题的观点来进行程序设计工作:输入——运算——输出。面向过程程序设计者需要变更习惯的思维方法以贴近计算机的内部工作机理。面向过程程序设计所具有的流的工作性质,试图通过信息流及其转换来认识系统,不仅加大了程序设计的难度,同时亦使得程序的可理解性比较差。面向对象程序设计方法中,一种普遍采用的优化方法是使用结构化的程序设计方法。面向过程程序设计方法一般适宜采用自上而下的设计方法。面向过程程序设计方法需要在一开始就全面的,自上而下的设计整个应用程序的架构,因此要求程序设计者对问题域有全面的了解。

2、面向对象程序设计是一种自下而上的程序设计方法,往往从问题的一部分着手,一点一点地构建出整个程序。面向对象设计一数据为中心,类作为表现数据的工具,成为划分程序的基本单位。

3、面向对象的编程方式有以下几个重要特点:

   (1)封装:类是属性和方法的集合,为了实现特定的某些功能而定义的类。开发者不需要了解类的内部是如何实现的,只需要通过对象或者类名.方法名调用某个属性和方法,实现某项功能。这就是类的封装性。
   (2)继承:通过继承可以创建子类和父类之间的层次关系,子类可以从父类继承属性和方法。例如:已经定义了A类,接下来准备定义B类。而B类中许多属性和方法与A相同,就可以使B继承A类,就无需在B类中定义A类已有的属性和方法。很大程度提高了编程效率。
   (3)多态:不同的类进行同一操作可以有不同的行为。即重载,调用同一方法名,但各方法中参数的数据类型、个数、顺序不同,只要类中有2个以上的同名方法,但是使用的参数类型、个数、顺序不同,编译时,编译器即可判断在什么情况下调用何种方法。

4、通过一个小游戏深刻理解面向对象的思想

   玩家和电脑玩石头、剪刀、布游戏。其中玩家由我们自己控制,可以选择出拳,电脑随机出拳。由裁判根据玩家和电脑出的拳判断输赢。

问题:

  • 玩家、电脑如何出拳,记录下出的拳,显示在窗体中,并将出的拳给裁判,用于以后的判断。
  • 如何将出的拳给裁判。
  • 裁判如何根据玩家和电脑的拳判断输赢。
思路:

  • 玩家 :                                           电脑:

                  

    石头   1                                         石头  1

    剪刀   2                                         剪刀  2              

    布     3                                          布    3


  •    裁判:

             

                   玩家赢、 电脑赢  平手


  • 玩家赢: 1 2(-1) ;2 3(-1) ;3 1(2)

    平手: 相减为0

    其他:电脑赢


  • 按照面向对象的思想:

    1、包含3个类:Player、Computer、Judgement,每个类中有自己的属性和方法

    2、Player类:

          每出一次拳,需要知道出的是什么,而且知道预先定义好的int型数据是多少,并保存下来,传递给裁判用于判断输赢,另一个要显示在出的是什么拳。

    3、Computer类:

          系统随机出拳,定义个Random类型,范围(1、2、3),并对应预定义的拳,保存,传递给裁判用于判断输赢,另 一个要显示在出的是什么拳。

    4、Judgement类:

          通过2个类传递过来的int型变量。计算输赢,显示出来。计算输赢的方法可定义成静态类,从而不用建立裁判对象,直接由类名.方法名调用。

5、附主要代码:

  • 玩家类
    class Player
    {
        public int ShowFist(string fist)
        {
            int num=0;
            switch (fist)
            {
                case "石头":
                    num=1;
                    break;
                case "剪刀":
                    num=2;
                    break;
                default:
                    num=3;
                    break;
            }
            return num;
        }
    }
  • 电脑类
    class Computer
    {
        /// <summary>
        /// 属性存储随机变量对应的拳头
        /// </summary>
        public string Fist
        {
            get;
            set;
        }
        public int ShowFist()
        {
            Random r=new Random();
            //随机数1,2,3
            int rNumber= r.Next(1, 4);
            switch (rNumber)
            {
                case 1: Fist="石头";
                    break;
                case 2: Fist="剪刀";
                    break;
                default: Fist="布";
                    break;
            }
            return rNumber;
        }
 
    }
  • Judgement类
    public enum Result
    {
        玩家赢,
        电脑赢,
        平手
    }
    class Judgement
    {
        public static Result PanDuan(int playerNum, int computerNum)
        {
            if (playerNum-computerNum==-1||playerNum-computerNum==2)
            {
                return Result.玩家赢;
            }
            else if (playerNum-computerNum==0)
            {
                return Result.平手;
            }
            else
            {
                return Result.电脑赢;
            }
 
        }
    }
  • 窗体类
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void btnStone_Click(object sender, EventArgs e)
        {
            //出拳为石头时,定义一个字符串传递给PlayGame函数,
            string str="石头";
            PlayGame(str);
        }
        private void btnCut_Click(object sender, EventArgs e)
        {
            string str="剪刀";
            PlayGame(str);
        }
        private void btnNo_Click(object sender, EventArgs e)
        {
            string str="布";
            PlayGame(str);
        }
        /// <summary>
        /// 通过玩家出的拳,求对应的int变量playerNum
        /// </summary>通过电脑出的拳,求对应的int变量computerNum
        /// 
        /// <param name="str"></param>
        private void PlayGame(string str)
        {
            //玩家出的拳显示在label
            lblPlayer.Text=str;
            Player player=new Player();
            int playerNum =player.ShowFist(str);
            Computer computer=new Computer();
            //Computer类不需要传递变量,由系统随机生成
            int computerNum=computer.ShowFist();
            lblComputer.Text=computer.Fist;
            Result res=Judgement.PanDuan(playerNum, computerNum);
            lblResult.Text=res.ToString();//显示判断结果
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值