關(guān)于POP和OOP的解釋我想網(wǎng)上的資料已經(jīng)數(shù)不勝數(shù)了,但是基本無非都是在擺理論。剛好本人既寫過面向過程(POP)的C程序也寫過面向?qū)ο螅∣OP)的C#程序,甚至是萬物皆對象的Python程序。下面本人就從自身的實際感受來給大家淺顯易懂的解析一下什么是面向?qū)ο缶幊?/p>
面向?qū)ο蟾菀鬃屓死斫?/strong>
其實object也可以翻譯為物件,我想這個詞對于初學(xué)者肯定比對象更友好。以前的pop思想其實就是過程導(dǎo)向,就是我想實現(xiàn)一個什么樣的計算結(jié)果,然后用變量和函數(shù)將這個結(jié)果實現(xiàn),但是這樣很抽象化,初學(xué)者較難理解。但是面向?qū)ο蟮脑拰⒊橄蟮母拍疃冀o你具像化了,是以物件為主導(dǎo)。接下來我用一段對比代碼展示可能更容易理解。
比如,我要計算兩個人繞著操場跑一圈的時間。

左邊是面向過程的,右邊是面向?qū)ο蟮摹F鋵嵜嫦驅(qū)ο螅憧梢詫⑺?運算符理解為我們漢語的‘的’,這樣更容易讓程序員理解
封裝
然后就講到面向?qū)ο蟮姆庋b,如上右圖。面向?qū)ο罂梢詫⑺俣取⒕嚯x等全部封裝在一個抽象的類中,然后再通過new操作來具像化對象,而面向過程只能通過函數(shù)和變量來存儲數(shù)據(jù)和運算。這樣當(dāng)一個工程夠大的時候,面向?qū)ο蟮某绦蚋菀拙S護,且重用性也更好
繼承和多態(tài)
繼承和多態(tài)的話是面向?qū)ο笞钪饕奶卣鳌F鋵嵰埠芎美斫狻_€是拿上面那個例子,現(xiàn)在有一個小孩,他除了run這個動作外還需要加一個喝奶(drinkMilk)動作,那么小孩子也屬于人這一類,我是不是可以不用再去重復(fù)的寫關(guān)于Run這個動作的相關(guān)代碼呢?由此,繼承的概念就出來了。
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可能速度計算不能跟大人一樣,可能需要自己的計算方法,那么怎么辦呢?這時候,多態(tài)的概念又出來了。我們只需要給父類的即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(); } } }
怎么樣,現(xiàn)在對面向?qū)ο笥幸粋€大概的了解了吧。相比面向過程,面向?qū)ο蟮乃枷朐诰帉懘笮晚椖繒r代碼更容易維護、更易懂、代碼重用率更高。但相對的犧牲的就是運行的效率了。