zoukankan      html  css  js  c++  java
  • 23 是时候学点面向对象的东东了

    1. 面向对象vs面向过程

    C#是一种面向对象的编程语言。那么什么是面向对象的编程呢?在没有面向对象的编程语言前,那时候的编程语言叫什么?

    面向对象的编程是将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想。

    在面向对象的编程思想出现前,传统的编程思想和编程语言是面向过程的。面向过程的编程是在面向对象编程出现以前非常流行的编程方法论。(软件行业的变化很快的,以前很流行的东西,随着新的东西不停的出来,没有多久就out了。)它主张将程序看作一系列函数的集合。程序通过调用一系列函数从而完成一个特定的功能。数据和函数是分开。

    “面向过程”的分析就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

    面向对象程序设计中的每一个对象都把数据和功能集合成一个整体。都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。

    “面向对象”的分析是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为还有各个事物之间的互动。

    举个例子:

    如何把大象装进冰箱?
    面向过程: 为了把大象装进冰箱,需要3个过程。这三个过程可以对应三个函数。 1) 把冰箱门打开 2) 把大象装进去 3) 把冰箱门关上 依次完成这些过程,就能把大象装进冰箱。
     
    面向对象: 分析把大象装进冰箱这个事情,我们分析出两个对象,大象和冰箱。 其中冰箱需要做三个动作,也就是三个方法。第二个动作要和大象互动。 1) 冰箱,你给我把门打开。   冰箱.开门()     2) 冰箱,你给我把大象装进去。 冰箱.装进(大象) 3) 冰箱,你给我把门关上。冰箱.关门() 依次做这些动作,就能把大象装进冰箱。

    面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法.它考虑的是实际地实现.一般的面向过程是从上往下步步求精.所以面向过程最重要的是模块化的思想方法.对比面向过程,面向对象的方法主要是把事物给对象化,对象包括属性与行为。
     
    我试着和大家解释了一下什么是面向对象,什么是面向过程。不知道你有没有搞清楚。但是我一定要给你一个忠告。
    作为一个程序员, 你选择面向过程, 就找不到对象。
    少年, 你可要想好了再选择啊 
     

    2. 面向对象编程两个最重要的概念:类和对象。

    • 类(Class):定义了一件事物的抽象特点。类的定义包含了数据以及对数据的操作方法。
    • 对象:是类的实例。

    举个例子帮助大家理解类和对象。

    车可以定义成一个类。它有颜色,品牌,行驶里程等属性,有启动发动机,停止发动机等功能。我的车就是车的一个实例,也就是车的一个对象。它的颜色是黑色的,它的品牌是奔驰(我梦想的品牌),它行驶1万公里,它有启动发动机,停止发动机等功能。我的车是一个独一无二的实际存在的。而作为类的车就是一个类别。我们可以说我的车是一个车。可以用这个类别构建出各种有不同属性的车。

    在我们前面的代码中已经接触到了C#的类(class)还有类的方法。我们的代码主要都放在Program 类的Main方法里边。我们也创建了我们自己的方法。同时我们也使用了类Console的writeline等方法。 

    在C#中几乎所有的东西都是和类相关的。我们编写的程序是由不同的类组成的。在每个类中可以有不同的属性和方法。如何去设计类和使用类呢?这就是面向对象编程要帮助我们解决的事情。 

    3. 静态成员和实例成员

    在类的成员的类型或者返回值类型前面加上关键字static,就能将该成员定义为静态成员(static member)。其他没有用static修饰的成员都是实例成员(instance member)或者称为非静态成员。静态成员属于类,被这个类的所有实例所共享;实例成员属于对象(类的实例),每一个对象都有实例成员的不同副本。

    静态成员具有下列特征:

    — 静态成员必须通过类名使用 . 运算符来引用,而不能用对象来引用。

    — 一个静态字段只标识一个存储位置。无论创建了一个类的多少个实例,它的静态字段在内存中都只占同一块区域。

    — 静态函数成员(方法、属性、事件、运算符或构造函数)不能作用于具体的实例,在这类函数成员中不能直接使用实例成员,必须通过类名来引用。

    实例成员具有以下特点:

    — 实例成员必须通过对象名使用 . 运算符来引用,而不能用类名来引用。

    — 类的实例字段属于类的实例所有,每创建一个类的实例,都在内存中为实例字段开辟了一块区域。类的每个实例分别包含一组该类的所有实例字段的副本。

    — 实例函数成员(方法、属性、索引器、实例构造函数或析构函数)作用于类的给定实例,在它们的代码体内可以直接引用类的静态和实例成员。

    其实,我们在前面的几章中大量使用的Console类的WriteLine等方法都是静态方法,都是通过类名Console来引用的。

    4. 面向对象编程的三个特性:封装,继承与复合,多态

    三大特性之一 封装

    1.什么是封装?

          封装又叫隐藏实现。就是只公开代码单元的对外接口,而隐藏其具体实现。

          比如我们的手机,手机的键盘,屏幕,听筒等,就是其对外接口。我们只需要知道如何按键就可以使用手机,而不需要了解手机内部的电路是如何工作的。封装机制就像手机一样只将对外接口暴露,而不需要用户去了解其内部实现。细心观察,现实中很多东西都具有这样的特点。

    2.如何实现封装?            

    在程序设计里,封装往往是通过访问控制实现的。C#中有 Public, Protected, Private 等访问控制符。通过用Public将信息暴露,Private,Protected将信息隐藏,来实现封装。

    三大特性之二 继承与组合     

    1.继承

           通过继承子类可以重用父类的代码。  

    2.组合

     组合即将各个部分组合在一起。程序设计中就是用已有类的对象来产生新的类。 

    桌子由木板和钉子组合而成,台灯使用灯座,灯管,电线,接头等拼起来的。我们发现自己周围的很多东西都是由更小的其它东西拼凑构成的,就像积木一样。相信你小的时候也曾拆开过许多你觉得好奇的东西,去一看究竟。去看看这个新的类(class)到底是由那些其他的类构成的。其实在你很小的时候你已经理解了组合。

    程序设计中,组合体现在生成的新类里用到了现有类的实例,具体的代码例子在这里也不给出了,相信你一看就能明白。组合使生成新类更加简便和直观,实现也非常容易,相比继承这种通过已有类构造新类的方法,大多数人(包括在现实生活中)更喜欢组合。  

    三大基石之三 多态


     多态是一个相对难理解的概念。多态和继承是紧密联系在一起的,没有继承就谈不上多态。

    多态就是把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
    赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。还是很抽象啊。举个例子吧。
     
    车是父类。它有一个方法叫启动。
    汽油车是车的一个子类。它也有一个方法叫启动,实现的功能是启动汽油车。
    电动车也是是车的一个子类。它也有一个方法叫启动,实现的是启动电动车。
     
    现在有个方法
    启动车(车){ 车.启动();}

    当我们把汽油车的一个对象作为参数传递给这个方法时,它会自动调用汽油车的启动方法。同样当我们把电动车车的一个对象作为参数传递给这个方法时,它会自动调用电动车的启动方法。当我们后来有新建了柴油车,太阳能车的时候,我们不用修改这个方法。将柴油车,太阳能车类型的对象作为参数传递给这个方法时,它就自动调用它们相应的启动方法。
               


    付费解答C#入门学习过程中碰到的各种问题。

    零基础学习C#入门,大多数的问题都可以通过自学或借助互联网解决。

    但是还是会有一些问题,不是那么容易解决,成为了你学习的绊脚石。最后甚至造成你学习的半途而废。通常学习C#编程入门,你会遇到20到30多个你不能很容易解决的问题。

    这个时候,你最需要什么呢?

    对!一个专业的老师给你帮助!

    你在学习本课程中,遇到任何问题都可以通过qq或email想本教程作者进行求助。

    只需30元你就可以得到本教程作者的三次专业解答。所以你只需不到300元就可以顺利的完成C#入门,从此推开软件行业的大门。

    付费方式非常简单:

    用微信扫描下面的二维码。在付款留言中留下你的qq号或email地址就可以啦。

    教育不是要便宜,而是要可靠!真正聪明的人,更懂得花钱让专业的人为自己服务,提高自己的效率。

    老师qq:2040227296

    老师email:2040227296@qq.com

  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/thinking-jiang/p/5680627.html
Copyright © 2011-2022 走看看