? 什么是面向對象?如果讓我理解,只有一句話:它是一個與面向過程相對的概念,是一種進化或者升級。人們所設計的程序幾乎都是線性思維,即一步一步往下執行。對于一個沒有人機交互的簡單程序來說,這是簡單易行的。然而,對于一個人機交互頻繁的復雜程序來說,比如某個你所熟悉的游戲,這絕對是一個毀滅性的災難。比如一個三人斗地主的游戲,我們會很自然把它描述成一個面向過程的算法。我的意思是說,通常情況下,我們的設計思路應該是這樣的:1、選地主 ?2、發牌 ?3、輪流出牌 ?4、判斷勝利。顯然,這個思路是較為完善的。然而,如果我們進一步的加以思索,就會發現整個流程顯得不夠精簡。我們至少可以提出以下見解:1、對于游戲中的三個玩家,其實他們有很多共同點。都能選地主、出牌、判定。2、我們能否讓代碼更精簡一些。比如每個人都要判斷是否勝利,我們能否寫一遍就夠了。3、地主和農民是有一些區別的,我們如何既能夠精簡代碼,又順利區分它們。
? 我以為,當人們遇到這種問題的時候,很自然的就會根據事物的共性抽象出事物的一個類。就好像根據香蕉、蘋果、橘子抽象出水果這個類一樣。具體來說,我們把每個玩家看成一個對象,對應于C#語言中的類。必須注意的是,這個類是一個具體的類別。通常情況下,我們總是用一個基類來描述具體類別的屬性和方法。并且,具體的類別應該繼承基類的屬性和方法。我們再詳細的說,我們可以把農民作為一個基類,并且規定農民的各項屬性,比如發牌數、出牌規則等。緊接著,我們讓地主繼承農民這個類。這樣,農民具有的屬性方法,地主也有了。另一方面,地主和農民是有區別,比如地主牌多。這個問題可以用虛方法和重寫方法去解決。就是把基類的方法改為虛方法,然后允許子類重寫方法。
? 我們來總結一下面向對象和面向過程的異同。面向過程需要寫很多類似的判斷,比如農民需要判斷是否勝利,地主也要。而面向對象只要在基類中寫好,子類繼承就行了。除此之外,這種程序設計思想還有一個巨大的好處:可以被引用。與原來一個程序就一個main函數相比,這種方式的代碼重復利用率是十分可觀的。很自然的,它也更加有利于程序的擴展。
? 到這里,我們說,面向對象思想的出現是極為自然的,并且符合現實需求的。它的出現對于程序設計無疑是一次質的飛躍。