zoukankan      html  css  js  c++  java
  • 面向过程,面向对象的深入理解二

    面向过程,面向对象的深入理解二

    面向过程,面向对象的深入理解二

    面向对象介绍,类和对象

      首先作为基础知识的回顾,我们可以看下我之前写过的文章:C#中超级好用的类思想的转变

      看完这两篇文章以后,我们看下如下的相关概念:

    构造函数特点:

            1.方法名称与类名称完全一样。

            2.构造函数没有任何返回值,哪怕是void

            3.构造函数的方法修饰符一般为public

    当手动为类添加构造函数后,会覆盖默认的那个无参数的构造函数。              

    快捷写构造函数的方法:ctor两下tab键。

    构造函数可以被重载。(只要参数列表不同即可。)

    构造函数补充问题: 通过反编译器,我们发现:程序编译的时候把我们在字段里面赋的值,放到了构造函数里面

    this表示当前对象。

    "类"也是一种数据类型,是一种自定义数据类型,可以通过类声明该类类型的变量。

    Teacher teacher = new Teacher("001", 10000);

      Teacher t1;表示声明了一个Teacher类型的变量 t1;

      new Teacher();表示创建了一个Teacher对象。

      两句话连起来,这样理解上面的代码: 创建了一个Teacher对象【new Teacher("001", 10000);】,并将该对象赋值给了一个Teacher类型的变量teacher

    下面我们用面向对象的思想做个简易计算器:

    首先看下,面向过程写的计算器的思路:

    图一、简易计算器

      我们再来看下封装之后的计算器的思路

     

    图二、封装计算器

     

    图三、猜拳游戏启动界面

    猜拳游戏思路:

    普通思维过程:我点击按钮的时候出石头、剪刀或布用1,2,3分别来代表上面的三个符号。

    系统出,也是1,2,3来代表,但是系统是随机出的。

    最后一判断就行了。

     

    上面的是普通的思维过程,现在用面向对象的方法来写。

    先想有几个对象,在哪几个类里面,这些对象有什么共同的特点

     

    分出:电脑 玩家  裁判  三个类

     

    怎么才能想到这三个类呢?

    分析过程:

    看到这个游戏后,参与游戏的有多少个对象呢?

    看看这样想行不行?有两个人他们都出拳,我们把他们写成一个类。同时看到有石头、剪刀、布。我们写成一个类。显然像上面这么写是不行的,因为具体的出拳不是游戏的参与者。由于两个玩家的内部实现不一样,所以,我们不能把他们写到一个类里面。

     

    大家再想一想,如果我把决定胜负的判断写到两个参与游戏的玩家之一里面可不可以呢?当然是不可以的,因为这样不公平了。

     

    大家有没有感觉上面的分析过程想不到呢?没关系,慢慢来,

     

    多做几个项目就好了。

     

    下面我们做个简易版的猜拳游戏,如下图:

     

    图四、简易版猜拳游戏

      首先写好猜拳游戏的winform界面。

     

    图五、猜拳游戏的winform

    按照我们的分析思路写下代码,首先我们需要写一个玩家类。在这个类中有个接收用户出拳的属性。

    还有个出拳的方法

    这个方法有没有参数和返回值呢?答案是有的,用户点击哪个按钮就返回对应的值。所以,这个方法是有参数的。并且方法本身没有决定权。

     

    写下电脑类

    也是写个属性接收电脑的出拳结果。

    想想这个方法有没有参数,有没有返回值?

    这个方法中电脑是随机出拳的,所以,没有参数。有返回值。也是int。

     

     

     

    图六、Player

     

    图七、Computer

     

    裁判类里面有个决定谁输谁赢的方法。我们想一想这个方法有没有参数,有没有返回值?

    答案是有参数的,参数就是玩家的选择结果和电脑随机的结果。

    返回值我们用枚举表示,这样比较的方便。

    在判断的时候我们找找规律,如下所示:

    裁判类分析过程

    1 表示:石头

    2表示: 剪刀

    3 表示:布

    1》相等

    平局

    2》

    在这块找找规律:

    用户赢:

    1   2 =-1

    2   3=-1

    3   1=2

    if(user==1 && computer==2 ||

    user==2&&computer==3 || user==3 &&

    computer==1){

    }

    3》电脑赢

    2    1 =1

    3    2 =1

    1    3 =-2

    图八、CaiPan

    下面我们写程序调用这个类。

    实例化一个玩家类

    调用写好的方法,给它传参,返回值是个整型int

     

    实例化一个电脑类

    调电脑的方法,注意:没有参数,有返回值。

     

    实例化一个裁判类

    调裁判方法,传入两个参数,它的返回值类型是个枚举类型,

     

    所以我们定义一个枚举来接收。

    下面就是根据出拳结果显示不同的内容。

    判断的过程已经在裁判类中完成了。

     

    把玩家还有电脑的出拳结果也显示出来。

     

      在同一段代码中,我们复制粘贴了两次,大家想一想,这样行么?根据变成的DRY原则:Don’t Repeat Yourself.

     

    图九、Form1

    面向对象[oo]

    oop面向对象编程(oop-> Object -Oriented Programming)

    ooa 面向对象分析

    ood 面向对象设计

    ooad 面向对象分析与设计。

     

    说到面向对象,我们想一想究竟什么是面向对象呢?

      面向对象一种思维方式,把程序用现实生活模拟的方式。好处:让程序更灵活,更有可拓展性。

    怎么才能实现这点呢?通过多态的方式实现。

    这个需要仔细的区思考。

    类、对象

    1.什么是类

     1>类是对某一类型对象的抽象,其中包含了该类型对象共有的属性和方法,类是抽象的。(如:医生,老师,军人)

    2.什么是对象

     2>对象是一个具体的事务,是某类的一个实例。对象是具体的。

    3.类与对象的关系

      类是由多个同类型对象抽象而来的,而对象在使用时需要通过类来产生new.

      类是一种自定义数据类型,而为这种数据类型赋值,的结果就是该类型的对象。

    Teacher t=new Teacher();

     

    属性:

    get

    {

    }

    set

    {

    }

     

    由一个私有字段,与两个公有的方法组成。

     

    class Test

    {

      public Test()

      {

           Console.WriteLine("Hello World!");

      }

     

     

    }

     

    Test t=new Test();

    t.Test();

    想想上面代码的执行结果是什么?

     

     

    图十、构造函数问题

     

      上面是知识点的回顾:

      下面我们再看看做过的猜拳游戏的代码简化:

     

    这里我们演示下如何将建在之前文件上的猜拳游戏加载到另一个文件上面吧。

     

    图十一、加载文件

    我们发现执行代码中,只有参数:石头、剪刀、布不一样。所以我们提取出来一个方法。

     

    图十二、猜拳简化代码第一步

     

    图十三、猜拳简化代码第二步

     

    图十四、猜拳简化代码第三步

    当我们写到这步,发现这些代码都写死了,所以,要再简化一下子。

     

     

    图十五、猜拳简化代码点击事件

    我发现点这三个按钮执行的代码几乎是一样的,我不要点剪刀,和布的方法了。点石头绑定到的是btnRock_Click这个方法上,我让点剪刀的时候也绑定到这个方法上,点布也绑定到这个方法上面,现在我点剪刀,布,执行的都是点石头这个方法。

    这个时候我们发现运行之后,点布还是剪刀的时候运行的都是石头的方法,那我们怎么解决这个问题呢?

     

    图十六、猜拳简化代码改变参数

    有没有发现这有两个参数:object sender,EventArgs e.大家用过这两个参数么?

     

    图十七、猜拳简化代码通过事件源知道当前点击按钮

      在整个猜拳游戏中,用到了一些我们刚刚介绍的知识,当然如果有朋友有更好的方法的话,欢迎在我的博客下面留言。

     

    作者近期文章列表:

    C#基础教程(完全免费,献给代码爱好者的最好礼物。注:本作者分享自己精心整理的C#基础教程,无任何商业目的。 希望与更多的代码爱好者交流心得,也请高手多多指点!!!)
    面向过程,面向对象中高级 面向过程,面向对象的深入理解一
    winform基础 Winform基础
    winform中常用的控件
    面向过程 三种循环的比较
    C#中的方法(上)
    我们常见的数组
    面向对象 思想的转变
    C#中超级好用的类
    C#中析构函数和命名空间的妙用
    C#中超级好用的字符串
    C#中如何快速处理字符串
    值类型和引用类型及其它
    ArrayList和HashTable妙用一
    ArrayList和HashTable妙用二
    文件管理File类
    多态
    C#中其它一些问题的小节
    GDI+ 这些年我收集的GDI+代码
    这些年我收集的GDI+代码2
    HTML概述 你不能忽视的HTML语言
    你不能忽视的HTML语言2精编篇
    你不能忽视的HTML语言3
     
     
  • 相关阅读:
    三 、 Multivariance Linear Regssion练习(转载)
    二、Linear Regression 练习(转载)
    一 、机器学习基础知识(转载)
    R-CNN论文详解(转载)
    ROC,AUC,PR,AP介绍及python绘制
    SVM较全面介绍,干货!(转载)
    ubuntu14.04 + cuda8.0 + cudnnv5 + caffe + py-faster-rcnn配置
    Windows系统 环境变量
    网络加密相关
    急救知识收集
  • 原文地址:https://www.cnblogs.com/liao290161655/p/8040018.html
Copyright © 2011-2022 走看看