面向对象,从开始学VB就听说了,但也可能是受VB的影响,我曾一直以为面向对象就是:有可以看得见的控件。并且我曾一度认为:VB是面向对象的,而C++是面向过程的,只因VB有控件,C++没有......
而到学C++的时候,得知:VB是基于对象的,而C++是面向对象的,瞬间凌乱,一直坚持的自认为的真理瞬间垮塌。
而查一些资料只得知:“面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。”
这么抽象的解释,我怎么可能理解?当然还有很多是讲解:对象、类、抽象、封装、继承、多态的各种含义和理解,但我想:这些我都微懂,也知道封装、继承、多态是面向对象的三大特征,这些老师经常讲,那到底什么才是面向对象呢......我真的很抓狂。
直到有了它《大话设计模式》,嘿嘿,突然间又有了一种“我貌似理解了些许”的赶脚~~
大鸟开始举的例子很形象:活字印刷术:最初的刻板印刷相当于面向过程,改动时需对整体修改,而后的活字印刷就相当于面向对象,修改时,只需修改某部分......
小菜的面试受挫,在大鸟的指导下他将他的计算器一步步改进,从他的改进过程中,我们更能体会到啥是面相对象:
他最初的较规范的作品是:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { try { Console.Write("请输入数字A:"); string strNumberA = Console.ReadLine(); Console.Write("请选择运算符号(+、-、*、/):"); string strOperate = Console.ReadLine(); Console.Write("请输入数字B:"); string strNumberB = Console.ReadLine(); string strResult = ""; switch (strOperate) { case "+": strResult = Convert.ToString(Convert.ToDouble(strNumberA) + Convert.ToDouble(strNumberB)); break; case "-": strResult = Convert.ToString(Convert.ToDouble(strNumberA) - Convert.ToDouble(strNumberB)); break; case "*": strResult = Convert.ToString(Convert.ToDouble(strNumberA) * Convert.ToDouble(strNumberB)); break; case "/": if (strNumberB != "0") strResult = Convert.ToString(Convert.ToDouble(strNumberA) / Convert.ToDouble(strNumberB)); else strResult = "除数不能为0"; break; } Console.WriteLine("结果是:" + strResult); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine("您的输入有错:" + ex.Message); } } }
但这样的思维使得程序只满足实现当前的需求,程序不容易维护,不容易扩展和复用......
而后在大鸟给他讲了活字印刷术后,他将业务和界面层相分离开......这样在修改界面时,就不会影响其它部分,修改业务时,也不至于打乱界面......
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 24px;"> </span></span><pre name="code" class="csharp">using System;</span>
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace p6计算器 { class Program { static void Main(string[] args) { try { Console.Write("请输入数字A:"); string strNumberA = Console.ReadLine(); Console.Write("请选择运算符号(+、-、*、/):"); string strOperate = Console.ReadLine(); Console.Write("请输入数字B:"); string strNumberB = Console.ReadLine(); string strResult = ""; strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA),Convert.ToDouble(strNumberB), strOperate)); Console.WriteLine("结果是:" + strResult); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine("您的输入有错:" + ex.Message); } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace p6计算器 { public class Operation { public static double GetResult(double numberA, double numberB, string operate) { double result = 0d; switch (operate) { case "+": result = numberA + numberB; break; case "-": result = numberA - numberB; break; case "*": result = numberA * numberB; break; case "/": result = numberA / numberB; break; } return result; } } }
通过看的这一段书,我也尝试给了面向对象一个定义:“面向对象的设计就是做到:对该程序修改时,都只需针对该程序的某部分,而不是整体的设计”。那么在这个思想的基础上,为了做到修改(维护、扩展、复用...)时只针对某部分,这就不得不需要我们考虑:通过封装、继承、多态把程序的耦合度降低......使程序更加灵活,容易修改,并且易于复用。
到这,不知道除我之外,有没有人能微微理解我所表达的.....如果理解不了,嘿嘿,那就来找我吧......