一 引子

为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持。

二 本节内容---重构代码,利用继承多态

1. 主界面截图如下:

2. 根据完成挡板和小球类的编写后,会发现挡板类和小球类代码中有非常类似的属性和方法,进一步思考,后续还需画砖块和子弹等图形,即要构建砖块和子弹类的同时还会有代码的重复,这样的现象是不好的程序编码,所以要重构代码。重构方法是:将挡板类和小球类的属性和方法提取成一个父类,挡板类和小球类都继承这一父类。

父类的定义代码如下:

    public class GameObject{//坐标public int XPos { get; set; }public int YPos { get; set; }//速度和方向控制public int SpeedX { get; set; }public int SpeedY { get; set; }//对象载体public Rectangle Rect { get; set; }public bool m_bIsDel = false;public virtual void Draw(Graphics g){}public virtual void Run(){}}

对于GameObject基类来说,因为其为抽象的基类对象,无法提供Draw和Run方法的实现,故此将这两个方法定义为虚方法,由具体的派生对象进行改写,提供自身的实现。

三 小球类代码改写

变更后的小球类代码如下(挡板类的改写与小球类的改写相似):

    public class Ball : GameObject{/// <summary>/// 初始化小球位置和偏移值/// </summary>public Ball(int x, int y, int speedX, int speedY){this.XPos = x;this.YPos = y;this.SpeedX = speedX;this.SpeedY = speedY;}public override void Draw(Graphics g){using (SolidBrush sbrush = new SolidBrush(Color.Snow)){Rect = new Rectangle(XPos, YPos, 20, 20);g.DrawEllipse(new Pen(Color.Gray), Rect);g.FillEllipse(sbrush, Rect);}g.Dispose();}public override void Run(){XPos = XPos + SpeedX;YPos = YPos - SpeedY;if (XPos <= 0)SpeedX = (new Random().Next(3, 5));if (XPos >= 378)SpeedX = -(new Random().Next(3, 5));if (YPos <= 100)SpeedY = -(new Random().Next(3, 8));if (YPos >= 580)SpeedY += (new Random().Next(3, 8));}}

四 主界面代码---利用多态

主界面修改如下:

首先定义一个list泛型集合对象:  List<GameObject> m_lstGameObject = new List<GameObject>();

将小球和挡板对象在BrickGame_Load事件中添加到m_lstGameObject中,m_lstGameObject.Add(m_Ball);    

                                  m_lstGameObject.Add(m_board);

BrickGame_Paint事件处理函数中,遍历lstGameObject集合,对取出的每一个对象调用Draw方法,根据多态性,会调用到各个派生类对象的Draw方法,这种办法的优点是,无论以后再加入任何游戏对象,我们只需让该对象继承GameObject对象,然后实现其特有的Draw方法及Run方法,而这里的代码无需再做任何改动。代码如下:

        private void BrickGame_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;foreach (GameObject go in m_lstGameObject){go.Draw(g);}  }

五 代码下载

本节代码下载

作者:不懒虫 
出处:http://www.cnblogs.com/poplanchong123/p/3595719.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

转载于:https://www.cnblogs.com/ice-river/p/3614085.html

Winform打砖块游戏制作step by step第5节---重构代码,利用继承多态相关推荐

  1. RDL(C) Report Design Step by Step 1: DrillThrough Report

    RDL(C) Report Design Step by Step 1: DrillThrough Report 前一段时间,发了几篇关于RDLC报表的随笔,由于这些随笔中没有关于报表设计方面的内容, ...

  2. 一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)

    本文是我在学习反向传播时翻译的一篇文章.原文链接如下. A Step by Step Backpropagation Example 实例学习 在这个例子里,我们将制作一个小型神经网络.它有两个输入, ...

  3. RDL(C) Report Design Step by Step

    RDL(C) Report Design Step by Step 1: DrillThrough Report 前一段时间,发了几篇关于RDLC报表的随笔,由于这些随笔中没有关于报表设计方面的内容, ...

  4. Abaqus进阶-汽车吸能盒冲击动力学分析 step by step

    一.写在前面 一听到ABAQUS,大家有会有什么反应?非线性?高大上?好难学-? 如果你刚好才开始接触ABAQUS,苦于无人带领入门:如果你已经接触过ABAQUS但是想要进一步提升仿真建模技能又愁没有 ...

  5. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core-使用.Net Core + Entity FrameWor ...

  6. python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输 ...

  7. C#2.0实例程序STEP BY STEP--实例二:数据类型

    C#2.0实例程序STEP BY STEP--实例二:数据类型 与其他.NET语言一样,C#支持Common Type Sysem(CTS),其中的数据类型集合不仅包含我们熟悉的基本类型,例如int, ...

  8. 文本分类step by step(二)

    (注:如有转载请标明作者:finallyliuyu, 和出处:博客园) <文本分类 step by step(一)> 在<文本分类step by step(一)>中,我们从处理 ...

  9. 数据库设计Step by Step (9)——ER-to-SQL转化

    2019独角兽企业重金招聘Python工程师标准>>> 引言:前文(数据库设计 Step by Step (8)--视图集成)讨论了如何把局部ER图集成为全局ER图.有了全局ER图后 ...

最新文章

  1. JSP自定义标签之简单标签入门
  2. 当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“C:\WINDOWS\Microsoft.NET\Frame 的写访
  3. 深度学习项目-人脸表情识别
  4. 【数据结构】线性表的顺序存储结构(c语言实现)
  5. idea黑色好还是白色好_白色牛仔裤,好看又好搭
  6. 设计模式学习笔记——命令模式
  7. rust笔记2 OwnerShip基础概念
  8. 北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码
  9. Ghost本地安装highlight.js使代码高亮
  10. 使用IIS 7.0 Smooth Streaming 优化视频服务
  11. 技术人,其实很有优势
  12. 计算机学科技术前沿:INFOCOM和SIGCOMM会议信息
  13. Stata因为“只读文件”不能存储的处理方法
  14. Shell判断字符串是否为空
  15. 怎样复制秀米html码,来,今天学习秀米的“复制粘贴”快捷键~
  16. Python基础--步长
  17. Angular 入门教程系列:37:使用ng-alain快速开发
  18. ios开发者添加开发测试机
  19. Learn Computer Vision-计算机视觉学习
  20. 软件开发模型介绍、总结归纳

热门文章

  1. PHP函数之CURL: 常见问题总结
  2. 我和“限速”之间的纠缠(一)
  3. Spring.NET学习笔记(4)-对象作用域和类型转换
  4. 数学之美系列16(转帖)
  5. quant companies
  6. if you do applications
  7. https://toonify.photos/ for Disney style
  8. 多元化和专一化的关系
  9. Visio修改默认字体样式
  10. LeetCode 669. Trim a Binary Search Tree修剪二叉搜索树 (C++)