關于POP和OOP的解釋我想網上的資料已經數不勝數了,但是基本無非都是在擺理論。剛好本人既寫過面向過程(POP)的C程序也寫過面向對象(OOP)的C#程序,甚至是萬物皆對象的Python程序。下面本人就從自身的實際感受來給大家淺顯易懂的解析一下什么是面向對象編程
面向對象更容易讓人理解
其實object也可以翻譯為物件,我想這個詞對于初學者肯定比對象更友好。以前的pop思想其實就是過程導向,就是我想實現一個什么樣的計算結果,然后用變量和函數將這個結果實現,但是這樣很抽象化,初學者較難理解。但是面向對象的話將抽象的概念都給你具像化了,是以物件為主導。接下來我用一段對比代碼展示可能更容易理解。
比如,我要計算兩個人繞著操場跑一圈的時間。

左邊是面向過程的,右邊是面向對象的。其實面向對象,你可以將他的.運算符理解為我們漢語的‘的’,這樣更容易讓程序員理解
封裝
然后就講到面向對象的封裝,如上右圖。面向對象可以將速度、距離等全部封裝在一個抽象的類中,然后再通過new操作來具像化對象,而面向過程只能通過函數和變量來存儲數據和運算。這樣當一個工程夠大的時候,面向對象的程序更容易維護,且重用性也更好
繼承和多態
繼承和多態的話是面向對象最主要的特征。其實也很好理解。還是拿上面那個例子,現在有一個小孩,他除了run這個動作外還需要加一個喝奶(drinkMilk)動作,那么小孩子也屬于人這一類,我是不是可以不用再去重復的寫關于Run這個動作的相關代碼呢?由此,繼承的概念就出來了。
namespace test0923 { class People { public double speed { get; set; } public double distance { get; set; } public double time { get; set; } public People() { } public People(double distance ,double speed) { this.distance = distance; this.speed = speed; } public double Run() { return this.distance / this.speed; } } class Children:People { public void drinkMilk() { Console.WriteLine("milk is very delicious"); } } class Progaram { static void Main(string[] args) { People xiaoMing = new People(100,10); xiaoMing.time = xiaoMing.Run(); People xiaoHua = new People(120, 12); xiaoHua.time = xiaoHua.Run(); Children baby = new Children(); baby.distance = 100; baby.speed = 2; baby.Run(); baby.drinkMilk(); } } }
那么另外一個問題又來了,小孩Run可能速度計算不能跟大人一樣,可能需要自己的計算方法,那么怎么辦呢?這時候,多態的概念又出來了。我們只需要給父類的即People的Run方法加上virtual,再在子類中加override就可以了
namespace test0923 { class People { public double speed { get; set; } public double distance { get; set; } public double time { get; set; } public People() { } public People(double distance ,double speed) { this.distance = distance; this.speed = speed; } public virtual double Run() { return this.distance / this.speed; } } class Children:People { public override double Run() { return this.distance/this.speed + 10; } public void drinkMilk() { Console.WriteLine("milk is very delicious"); } } class Progaram { static void Main(string[] args) { People xiaoMing = new People(100,10); xiaoMing.time = xiaoMing.Run(); People xiaoHua = new People(120, 12); xiaoHua.time = xiaoHua.Run(); Children baby = new Children(); baby.distance = 100; baby.speed = 2; baby.Run(); Console.WriteLine(baby.Run()); baby.drinkMilk(); Console.Read(); } } }
怎么樣,現在對面向對象有一個大概的了解了吧。相比面向過程,面向對象的思想在編寫大型項目時代碼更容易維護、更易懂、代碼重用率更高。但相對的犧牲的就是運行的效率了。