日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于对象和面向对象编程范式辨析和主流编程语言中的应用

發布時間:2025/3/21 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于对象和面向对象编程范式辨析和主流编程语言中的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

基于對象和面向對象編程范式辨析和主流編程語言中的應用 前言 本文的目的是想告訴大家,為什么C++的模板這么強大。為什么Ruby的Duck Typing(像鴨子那樣編程)這么強大! 基于對象和面向對象編程范式 關于基于對象和面向對象編程范式,我有著不同于傳統的理解。我認為我的理解更能體現出這2個范式的本意。 基于對象,就是使用類封裝操作和操作依賴的數據。用類來表示一個概念。類的公共成員,包括函數和數據,就是類的接口,也叫作抽象數據類型(ADT)。 面向對象,就是使用類的接口實現機制來表示操作。一個接口使用一組相關的公共函數代表一個概念的操作。一些類實現這個接口。這個實現類可以互換。 在使用中,使用接口的指針或者引用來調用對象。具體的對象是接口的某個實現類。可以不改變代碼,僅僅改變實際的對象來實現動態修改系統的行為。 這就是“動態多態”的能力。 面向對象的動態多態能力,使抽象能力比函數更進一步。 動態多態,在實現中是使用了“虛函數”機制來實現的。 對象指向的本類的虛函數表來查得真正需要調用的方法。 語言特性對比表 C++Java?????? .NET???? Ruby??????????? 類型強類型強類型強類型強類型 靜態/動態靜態靜態檢驗類型動態解釋執行動態 支持面向過程是否否否 支持基于對象是否是是 支持范型否是是否 支持模板是否否否 C++通過抽象基類來作為接口,通過對抽象基類的繼承來實現這個接口。 Java和.NET都提供了Interface接口類型。實現接口的類實現了這個機制。 所以說,C++,Java,.NET都支持面向對象的編程范式。特別是java,它只支持面向對象(也就是動態多態)這一種編程范式。其他一概不支持! 動態類型語言,如Ruby,JavaScript都沒有接口。為什么呢? 考慮一下,動態類型語言盡管有類型。但是變量都是沒有類型的。如 //偽代碼 Class Dao1{ Public void save(model){ //保存數據 } } Class Dao2{ Public void save(model){ //保存數據 } } Class Service{ @dao; Public void save(model){ this.dao.save(); } } //調用代碼: New Service(new Dao1).save(model); New Service(new Dao2).save(model); 這里,Dao1,Dao2這2個類需要實現一個共同的接口嗎? 動態類型語言中,盡管對象是有類型的,但是變量(實際是指向對象的指針)是沒有類型的。Service類的變量dao可以是任何類型!只要那個對象所屬的類型有Public void save(model);這樣簽名的函數即可! 動態類型語言中,根本不需要Java等靜態語言中的接口的概念。這就是動態類型語言著名的Duck Typing“像鴨子一樣編程”的理念。 Java這樣的靜態類型語言當然也有自己的優點。那就是通過強制實現接口。可以保證程序員不會因為筆誤而調用錯誤的類型。 但是,在實踐中,動態類型語言的Duck Typing卻是更加靈活,更勝一籌! 動態語言既然沒有接口,那么它們調用的方法,也就是該類的方法或者繼承的方法,就不需要虛函數表,也就不是面向對象的“動態多態”機制了。 Ruby,JavaScript的“多態”機制,是“動態基于對象”的機制。 根據我的定義標準,Ruby,JavaScript等動態類型語言是“基于對象”編程范式的語言。是“動態基于對象”的編程語言。而非面向對象編程語言。 可能你會說,Ruby,JavaScript 都有“繼承”的能力,怎么能說它們不是面向對象編程語言呢? “繼承”,只是一種代碼重用機制。和編程范式這樣的設計問題根本答不上邊。甚至,我反對大量使用繼承來重用代碼(少數特殊情況除外)。我們應該使用“組合”來重用代碼。 因為繼承會造成類和類之間的實現依賴。而組合就不會有這種依賴關系。我們只要寫上一些通道代碼就可換取類和類之間的解耦。 好了,現在再讓我們看看C++的基于對象的編程范式。 C++的基于對象,就是設計一些類,把函數和函數需要的數據封裝在一個類中。但是,如何實現真正的ADT(抽象數據類型)呢? 這樣:頭文件代表抽象數據類型。實現文件中提供定義。如果一個抽象數據類型需要多個實現呢? 我們為一個類提供幾個實現文件。用哪一個就提供哪一個版本。這樣顯然非常繁瑣。事實上也沒有人會這樣編程! 那怎么辦呢?難道C++這樣的靜態類型語言的“基于對象”編程范式,注定就不能實現多態嗎?C++的模板機制解決了這個問題!(在沒有徹底搞懂模板之前,我一直用面向對象編程范式使用C++,因此對C++是怨聲載道!) 如: //偽碼 Template<tyepe?TDao >Class Service{ Private: TDao* dao=new TDao(); Public: Void?save(Model model){ This->dao->save(model); } } //使用 Model*?model=new Model(); Service<Dao>* service=new Service<Dao>(); Service->save(model); 假設Dao這個類有Public: Void?save(Model model);這樣簽名的方法。 Void?save(Model model)這個函數就是TDao這個抽象數據類型(ADT)公布的方法。 任何類只要有這樣的方法,就滿足TDao這個ADT,就可以在Service模板類中使用! 對照上面Ruby的偽碼,我們可以發現: 1,C++的“模板支持的基于對象”的編程范式,僅僅比動態基于對象語言多了模板參數類型的聲明。 而且,C++可以直接在模板類內部實例化類型。真正的類型只有在編譯時才指定。而動態基于對象的語言因為沒有代表類型的符號,不能實例化未知的類型。 2,C++的“模板支持的基于對象”的編程范式,指定了模板參數類型,也就是在編譯時需要驗證類型。這就比動態基于對象的語言多了編譯時靜態驗證類型這一道關卡,更加安全可靠。 C++中模板之所以偉大,正是因為它是靜態語言中支持基于對象編程范式的銀彈! C++的“模板支持的基于對象”的編程范式,令C++擁有了與Ruby等動態基于對象編程語言的多態能力相比肩的頂級語言! 總結 基于對象和面向對象編程共有三種范式。它們提供了強大的動態或者靜態多態能力,使用它們編程,將令你的程序面向抽象,易于更換。 1,“模板支持的基于對象”的編程范式。這種編程范式適用于靜態類型的語言。提供了靜態多態的能力。典型的如C++。 模板不同于范型。模板是一種編譯時的代碼生成機制。而泛型是對模板的模擬。在java和.net中都使用類型轉換機制而不是源代碼生成機制來實現。 我認為模板優于范型。.NET的范型實現的要比Java好。.NET中可以使用new()關鍵字實現在范型類中創建未知類型的對象,而java中不可以。 “模板支持的基于對象”的編程范式實現了編譯時靜態的多態。具備了強大的靜態多態能力。而且生成的代碼運行速度快。 缺點是,如果寫得不好,容易發生源代碼擴張的問題。 2,“靜態類型語言”的面向對象的編程范式。這種編程范式適用于靜態類型的語言。提供了動態多態的能力。典型的如Java,NET。 使用接口和實現接口的技術,實現了動態多態。并且可以利用靜態類型檢驗的優勢,進行更加完善的類型安全檢查。 C++也具有進行這一編程范式的能力。但是,C++對于這一編程范式的支持并不是很好。因此,C++編程中,應該優先使用“模板支持的基于對象”的編程范式。然后再考慮使用“靜態類型語言”的面向對象的編程范式實現多態。 3,“動態類型語言”的基于對象的編程范式。使用Duck Typing“像鴨子一樣編程”的編程理念。這種編程范式適用于動態類型的語言。它們有類型,但是變量不確定類型。典型的如Ruby。這也實現了動態的多態能力。

總結

以上是生活随笔為你收集整理的基于对象和面向对象编程范式辨析和主流编程语言中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。