轉(zhuǎn)眼間,在編程道路上的行走已經(jīng)快一年了,心里突然覺得有許多話想拿出來與大家分享一下.我覺得我的路走得很不一般,首先我是學無線電出身的.與編程有點接觸,但并不是看家本領(lǐng).好閑話少述,我們進入正題吧,不然斑竹要刪帖了,我的話題是屬于C++,希望我沒走錯屋子,作為我在這個壇子里的第一帖,我想談談我對組件的一些看法.
簡而言之,組件就是對象。C++中沒有組件的概念,但它可以做出各種各樣的組件,C++是一門語言,而組件是一個編程模型,Delphi中叫部件,而在Visual BASIC中叫控件。
組件是對數(shù)據(jù)和方法的簡單封裝,C++能夠?qū)崿F(xiàn)組件就因為C++ 對象模型具備這樣的能力。組件可以有自己的屬性和方法。屬性是組件的數(shù)據(jù)存貯單位。方法則是組件的一些簡單而可見的功能。
為了說明白話題,我來具個例子,我想開發(fā)一個工程,這個工程的功能是簡單得不能再簡單的計算.設這個實現(xiàn)1+1=2的組件的方法為int Add(int var1=1, int var2=1),實現(xiàn)了這個組件后,我把這個組件買過來,進行二次開發(fā).也就是說我的應用程序用了這個組件,但我在用的過程中我得到的并不是原碼,只是二進制的可執(zhí)行碼,和相關(guān)的頭文件(.H什么的…),還有庫文件(.lib什么的),最后一個是.dll文件.我在應用中用的只是Add這個方法,它的實現(xiàn)我不知道,但它行為的結(jié)果,我可以接受,因為我要它算1+1=?時,它不會告訴我等于11.但是總于有那么一天(或者真有)1+1不等于2了,我就要向賣給我這個組件的開發(fā)商說:”我說朋友呀,你最初賣給我的東西,過時了,現(xiàn)在都何年代了,怎么1+1從你的產(chǎn)品出來的還是等于2呢?我現(xiàn)在呀,沒時間再改我原先的應用了,你得負責,你得讓我原來的應用得出1來呀,不然我以后不再與你合作了”,這時開發(fā)商就回去改變了它原先的組件,然后把它交給我,我當然不會再為我原先的應用重新編譯拉,鏈接拉什么的…我只是把它給我的.dll覆蓋掉老到掉牙的那分.dll.然后我執(zhí)行我的老應用程序,奇跡出現(xiàn)了,1+1真的不是2了,而是1或作別的什么的.
這就是組件的一般用法,不過它感人的地方遠遠不只這些呀.接下來我要來點術(shù)語了和細節(jié)了.
首先提個問題(看來我的問題挺多的,呵呵)
為什么COM (Common Component Objce)只能提供接口(Interface接口是一個包含方法入口地址的表格,但更確切的說,它就是一個指向表格的指針變量的一個地址,是不是不好理解)給用戶訪問對像,而不能直接訪問Object的數(shù)據(jù)成員呢?
這個問題的答案是: 這并不是絕對不可以直接訪問Object的數(shù)據(jù)成員,要訪問得有條件:
1 客戶端的應用程序必須由支持指針的語言來開,例如C++, 但VB不可以.
2 一旦一個組年已經(jīng)生成,也就是編譯,鏈接成.dll文件后,就不能再改變組件的數(shù)據(jù)成員了(例如,給對像加一個變量,刪除一個等),甚至把數(shù)據(jù)員聲明順序也不能改變,但接口可以擴充,記住原來的接口也不可以改變的,但可以擴充.(因為擴充接口,和改變接口的實現(xiàn),是COM較為討人喜歡的地方之一)
要我接受這么苛刻的要求,就相當于,1+1永遠等于2了,不能再改變了,也就是,開發(fā)商不會再為我提供更新的服務了.如果要,的話,你得重新編譯鏈接,那么我還開發(fā)什么組件呀,開發(fā)商直接給我源碼得了唄.這樣看來我們最還是不要直接訪問組件對像的數(shù)據(jù)成員好了.這也是COM最基本特性之一.
為什么會這樣呢?
這又得從COM所采用的對象模型談起(真累呀!).不知道是巧合還是微軟有意思將COM模型建立在C++對象模型的基礎之上.也就是說現(xiàn)在我們的重點是放在C++對象模型上了.眾所周知C++對象模型的特點是:
1 空間和存取時間的效率較好(最起碼要比CORBA和SOM所采取的對像模型要好)
2 靈活性及彈性確不夠理想,例如,不能直接訪問對象的數(shù)據(jù)成員就表明彈性不足(但CORBA 和SOM確可以)
通常情況下,效率和彈性是一對死對頭,兩者都很Radical(極端).如果你要效率,那么你會去相應的彈性,反之亦然.就好像VB比較可人,但運行起來要比C++大哥慢許多一樣.但它們誰也不指望誰要消失.因為,各有各的長處就是了.
至于,C++對像模型(COM采用),表格驅(qū)動對像模型(CORBA和SOM采用)我想下次再說吧,我為我的帖子寫了我前提到的組件(實現(xiàn)Add), 但不知道為什么原因總傳不上來,如果誰有興趣就跟貼吧,大家多頂幾下,想必這是我的第一貼,呵呵
簡而言之,組件就是對象。C++中沒有組件的概念,但它可以做出各種各樣的組件,C++是一門語言,而組件是一個編程模型,Delphi中叫部件,而在Visual BASIC中叫控件。
組件是對數(shù)據(jù)和方法的簡單封裝,C++能夠?qū)崿F(xiàn)組件就因為C++ 對象模型具備這樣的能力。組件可以有自己的屬性和方法。屬性是組件的數(shù)據(jù)存貯單位。方法則是組件的一些簡單而可見的功能。
為了說明白話題,我來具個例子,我想開發(fā)一個工程,這個工程的功能是簡單得不能再簡單的計算.設這個實現(xiàn)1+1=2的組件的方法為int Add(int var1=1, int var2=1),實現(xiàn)了這個組件后,我把這個組件買過來,進行二次開發(fā).也就是說我的應用程序用了這個組件,但我在用的過程中我得到的并不是原碼,只是二進制的可執(zhí)行碼,和相關(guān)的頭文件(.H什么的…),還有庫文件(.lib什么的),最后一個是.dll文件.我在應用中用的只是Add這個方法,它的實現(xiàn)我不知道,但它行為的結(jié)果,我可以接受,因為我要它算1+1=?時,它不會告訴我等于11.但是總于有那么一天(或者真有)1+1不等于2了,我就要向賣給我這個組件的開發(fā)商說:”我說朋友呀,你最初賣給我的東西,過時了,現(xiàn)在都何年代了,怎么1+1從你的產(chǎn)品出來的還是等于2呢?我現(xiàn)在呀,沒時間再改我原先的應用了,你得負責,你得讓我原來的應用得出1來呀,不然我以后不再與你合作了”,這時開發(fā)商就回去改變了它原先的組件,然后把它交給我,我當然不會再為我原先的應用重新編譯拉,鏈接拉什么的…我只是把它給我的.dll覆蓋掉老到掉牙的那分.dll.然后我執(zhí)行我的老應用程序,奇跡出現(xiàn)了,1+1真的不是2了,而是1或作別的什么的.
這就是組件的一般用法,不過它感人的地方遠遠不只這些呀.接下來我要來點術(shù)語了和細節(jié)了.
首先提個問題(看來我的問題挺多的,呵呵)
為什么COM (Common Component Objce)只能提供接口(Interface接口是一個包含方法入口地址的表格,但更確切的說,它就是一個指向表格的指針變量的一個地址,是不是不好理解)給用戶訪問對像,而不能直接訪問Object的數(shù)據(jù)成員呢?
這個問題的答案是: 這并不是絕對不可以直接訪問Object的數(shù)據(jù)成員,要訪問得有條件:
1 客戶端的應用程序必須由支持指針的語言來開,例如C++, 但VB不可以.
2 一旦一個組年已經(jīng)生成,也就是編譯,鏈接成.dll文件后,就不能再改變組件的數(shù)據(jù)成員了(例如,給對像加一個變量,刪除一個等),甚至把數(shù)據(jù)員聲明順序也不能改變,但接口可以擴充,記住原來的接口也不可以改變的,但可以擴充.(因為擴充接口,和改變接口的實現(xiàn),是COM較為討人喜歡的地方之一)
要我接受這么苛刻的要求,就相當于,1+1永遠等于2了,不能再改變了,也就是,開發(fā)商不會再為我提供更新的服務了.如果要,的話,你得重新編譯鏈接,那么我還開發(fā)什么組件呀,開發(fā)商直接給我源碼得了唄.這樣看來我們最還是不要直接訪問組件對像的數(shù)據(jù)成員好了.這也是COM最基本特性之一.
為什么會這樣呢?
這又得從COM所采用的對象模型談起(真累呀!).不知道是巧合還是微軟有意思將COM模型建立在C++對象模型的基礎之上.也就是說現(xiàn)在我們的重點是放在C++對象模型上了.眾所周知C++對象模型的特點是:
1 空間和存取時間的效率較好(最起碼要比CORBA和SOM所采取的對像模型要好)
2 靈活性及彈性確不夠理想,例如,不能直接訪問對象的數(shù)據(jù)成員就表明彈性不足(但CORBA 和SOM確可以)
通常情況下,效率和彈性是一對死對頭,兩者都很Radical(極端).如果你要效率,那么你會去相應的彈性,反之亦然.就好像VB比較可人,但運行起來要比C++大哥慢許多一樣.但它們誰也不指望誰要消失.因為,各有各的長處就是了.
至于,C++對像模型(COM采用),表格驅(qū)動對像模型(CORBA和SOM采用)我想下次再說吧,我為我的帖子寫了我前提到的組件(實現(xiàn)Add), 但不知道為什么原因總傳不上來,如果誰有興趣就跟貼吧,大家多頂幾下,想必這是我的第一貼,呵呵

