




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、從面向?qū)ο蟮矫嫦駽OM主講 葉長青華東師大教育信息技術(shù)學(xué)系2006-3-1 麗娃河畔本課的內(nèi)容及目標(biāo)內(nèi)容: 面向?qū)ο蟮囊话愀拍?從面向?qū)ο蟮矫嫦駽OM COM組件技術(shù)目標(biāo): 了解程序設(shè)計(jì)技術(shù)的發(fā)展動(dòng)向 提升程序設(shè)計(jì)能力 開闊專業(yè)視野課程參考書目 COM原理與應(yīng)用COM本質(zhì)論 COM技術(shù)內(nèi)幕 Advanced CORBA Programming with C+ 面向?qū)ο蟮幕靖拍?為節(jié)省每一個(gè)字節(jié)而努力的階段例:用PASCAL語句寫成的程序段 AI:=AI + AT; AT:=AI AT; AI: =AI AT;目的是什么?我們現(xiàn)在習(xí)慣的寫法是什么? 不關(guān)心“空間的浪費(fèi)”,更關(guān)心程序的清晰框架結(jié)
2、構(gòu)階段例:用FORTRAN語言編寫的程序段 DO 5 I=1,N DO 5 J=1,N5 V(I,J) = (I/J)*(J/I)程序設(shè)計(jì)的發(fā)展歷程 注重“重用性”的問題。 面向?qū)ο?注重“標(biāo)準(zhǔn)化元件”的階段。 面向組件?軟件企業(yè)分工細(xì)化階段 類是具有相同屬性特征事物的集合。計(jì)算機(jī)專業(yè)語境下,類是封裝了狀態(tài)(變量)和操作(對(duì)變量處理的過程和函數(shù))的抽象數(shù)據(jù)類型。(對(duì)應(yīng)于標(biāo)準(zhǔn)數(shù)據(jù)類型) 對(duì)象是實(shí)例,它反映了具體的事物。 鳥,是類的概念。麻雀是鳥類的一個(gè)實(shí)例。一只麻雀? 對(duì)象由類來定義 一個(gè)對(duì)象可以與多個(gè)具有繼承關(guān)系的類相聯(lián)系,即:A是一個(gè)類,B、C、D是在A的基礎(chǔ)上擴(kuò)展后的新類,E,F(xiàn),G則是在
3、C類的基礎(chǔ)上發(fā)展而來,而對(duì)象x 是F類的一個(gè)實(shí)例。有關(guān)術(shù)語 封裝是實(shí)現(xiàn)面向?qū)ο蟪绦蛟O(shè)計(jì)的第一步,封裝就是將數(shù)據(jù)或函數(shù)等集合在一個(gè)個(gè)的單元中(我們稱之為類)。 C+對(duì)類和對(duì)象的描述:Class studentPublic:成員函數(shù)1;成員函數(shù)2;Private:成員變量1;成員變量2; Int x,y;Student z;類名例一:C+中類的定義與實(shí)現(xiàn)說明:包含成員變量,成員函數(shù),類的定義,對(duì)象的定義。例二、例三:成員函數(shù)在類內(nèi)、類外實(shí)現(xiàn)的情形例四:成員函數(shù)是私有函數(shù)時(shí)的存取特性與意義 封裝的意義在于保護(hù)或者防止代碼(數(shù)據(jù))被我們無意中破壞。 在面向?qū)ο蟪绦蛟O(shè)計(jì)中數(shù)據(jù)被看作是一個(gè)中心的元素并且和
4、使用它的函數(shù)結(jié)合的很密切,從而保護(hù)它不被其它的函數(shù)意外的修改。 從程序語言角度來看,在一個(gè)對(duì)象中代碼和(或)數(shù)據(jù)可以是這個(gè)對(duì)象私有的,不能被對(duì)象外的部分直接訪問。因而對(duì)象提供了一種高級(jí)保護(hù)以防止程序被無關(guān)部分錯(cuò)誤修改或錯(cuò)誤地使用了對(duì)象的私有部分。 當(dāng)從對(duì)象外部試圖直接對(duì)受保護(hù)的內(nèi)部數(shù)據(jù)進(jìn)行修改時(shí),將被程序拒絕,只有通過對(duì)象所提供的對(duì)外服務(wù)函數(shù)才能夠?qū)ζ鋬?nèi)部數(shù)據(jù)進(jìn)行必要的加工,從而保證了數(shù)據(jù)加工的合法性。 從這一意義上講,把這種代碼和數(shù)據(jù)的聯(lián)系稱為“封裝”。換句話說,封裝是將對(duì)象封閉保護(hù)起來,是將內(nèi)部細(xì)節(jié)隱蔽起來的能力。 實(shí)現(xiàn)的細(xì)節(jié)是“可變的部分”。如果“塊”是單個(gè)類,那么可變的部分通常用 pr
5、ivate: 或 protected: 關(guān)鍵字來封裝。 “穩(wěn)定的部分”是接口。好的接口提供了一個(gè)以用戶的詞匯簡化了的視圖,并且被從外到里的設(shè)計(jì)。(此處的“用戶”是指其它開發(fā)者,而不是購買完整應(yīng)用的最終用戶)。 設(shè)計(jì)一個(gè)清晰的接口并且將實(shí)現(xiàn)和接口分離,只不過是允許用戶使用接口并強(qiáng)迫用戶使用接口。 如何才能防止其它程序員查看我的類的私有部分而破壞封裝?討論 封裝是一種安全裝置嗎? 封裝要防止的是錯(cuò)誤, 而不是間諜封裝 != 安全。錢掉了!繼承的概念及重要性 inheritance :是軟件重用的一種形式,將相關(guān)的類組織起來,并分亨其間的共通數(shù)據(jù)和操作行為。最具吸引力的特點(diǎn): 新類可以從現(xiàn)有的類庫中
6、繼承。提倡建立與現(xiàn)有的類有許多共性的新類,添加基類的所沒有的特點(diǎn)以及取代和改進(jìn)從基類繼承來的特點(diǎn)來實(shí)現(xiàn)軟件的重用 單重繼承形成樹狀層次結(jié)構(gòu),由基類和派生類構(gòu)成了一種層次關(guān)系,繼承的層次在系統(tǒng)的限制范圍內(nèi)是任意的。2.基類 父類定義了所有子類共通的對(duì)外接口和私有實(shí)現(xiàn)內(nèi)容,父類被稱為基類 成員函數(shù): 基類的私有成員只能被基類的成員函數(shù)和友元訪問,基類的受保護(hù)成員只能被基類及派生類的成員函數(shù)和友元訪問3.派生類 新類繼承預(yù)定義基類的數(shù)據(jù)成員和成員函數(shù),而不必重新編寫數(shù)據(jù)成員和成員函數(shù),這種新類叫派生(derived)類派生類永遠(yuǎn)不能直接訪問基類的私有成員重定義函數(shù): 派生類中無需繼承的功能及要擴(kuò)充的
7、基類功能可以重定義成員函數(shù),但在派生類再調(diào)用基類的同名函數(shù)時(shí)要用到作用域運(yùn)算符Employee:print()派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù):由于派生類繼承了基類的成員,所以在建立派生類的實(shí)例對(duì)象時(shí),必須調(diào)用基類的構(gòu)造函數(shù)來初始化派生類對(duì)象中的基類成員??呻[式的調(diào)用基類構(gòu)造函數(shù),也可在派生類的構(gòu)造函數(shù)中通過給基類提供初始化值(成員初始化值列表)明確的調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)調(diào)用順序: 先執(zhí)行基類的構(gòu)造函數(shù)-派生類構(gòu)造函數(shù)析構(gòu)函數(shù)調(diào)用順序正好相反。 派生類不繼承基類的構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值運(yùn)算符,但派生類的構(gòu)造函數(shù)和賦值運(yùn)算符能調(diào)用基類的構(gòu)造函數(shù)和賦值運(yùn)算符。例一:基類和派生類的構(gòu)造函數(shù)說明:在繼承
8、關(guān)系中構(gòu)造函數(shù)執(zhí)行順序。例二:指向類的指針說明:int *p; /指向整型的指針P。例三:對(duì)不同的類使用相同的指針說明:程序從頭到尾始終只用一個(gè)“萬能”指針指引一切。例四:使用指針時(shí)基類和派生類名字的沖突說明:如果基類和派生類中有同名函數(shù),會(huì)怎樣呢?多態(tài) 多態(tài)性是面向?qū)ο蟮暮诵?,它的最主要的思想就是可以采用多種形式的能力,通過一個(gè)用戶名字或者用戶接口完成不同的實(shí)現(xiàn)。通常多態(tài)性被簡單的描述為“一個(gè)接口,多個(gè)實(shí)現(xiàn)”。在C+里面具體的表現(xiàn)為通過基類指針訪問派生類的函數(shù)和方法。 換一種說法:如果使用基類指針訪問派生類中的同名函數(shù),希望執(zhí)行的是派生類中的成員函數(shù),怎樣實(shí)現(xiàn)? 下面我們看一個(gè)靜態(tài)聯(lián)編的例子
9、:#include class shape public: void draw()cout“I am shape endl; void fun()draw(); ;class circle:public shape public: void draw()cout“I am circle fun(); 程序的輸出結(jié)果? 程序的輸出結(jié)果我們希望是I am circle造成這個(gè)結(jié)果的原因是靜態(tài)聯(lián)編。解釋: 靜態(tài)聯(lián)編需要在編譯時(shí)候就確定函數(shù)的實(shí)現(xiàn),但事實(shí)上編譯器在僅僅知道shape的地址時(shí)候無法獲取正確的調(diào)用函數(shù),它所知道的僅是shape:draw(),最終結(jié)果只能是draw操作束縛到shape類上。
10、產(chǎn)生I am shape的結(jié)果就不足為奇了。事實(shí)上卻輸出了“I am shape” 為了能夠引起動(dòng)態(tài)聯(lián)編,我們只需要將需要?jiǎng)討B(tài)聯(lián)編的函數(shù)聲明為虛函數(shù)即可。動(dòng)態(tài)聯(lián)編只對(duì)虛函數(shù)起作用。我們?cè)谕ㄟ^基類而且只有通過基類訪問派生類的時(shí)候,只要這個(gè)基類中直接的或者間接(從上層繼承)的包含虛函數(shù),動(dòng)態(tài)聯(lián)編將自動(dòng)喚醒。下面我們將上面的程序稍微改一下。 #include class shape public: virtual void draw()coutI am shapeendl; void fun()draw(); ; class circle:public shape public: void draw
11、()coutI am circledraw(); 程序執(zhí)行得到了正確的結(jié)果I am circle。關(guān)鍵動(dòng)態(tài)聯(lián)編過程: 編譯器在執(zhí)行過程中遇到virtual關(guān)鍵字的時(shí)候,將自動(dòng)安裝動(dòng)態(tài)聯(lián)編需要的機(jī)制,首先為這些包含virtual函數(shù)的類(注意不是類的實(shí)例)-即使是祖先類包含虛函數(shù)而本身沒有-建立一張?zhí)摂M函數(shù)表VTABLE。在這些虛擬函數(shù)表中,編譯器將依次按照函數(shù)聲明次序放置類的特定虛函數(shù)的地址。同時(shí)在每個(gè)帶有虛函數(shù)的類中放置一個(gè)稱之為vpointer的指針,簡稱vptr,這個(gè)指針指向這個(gè)類的VTABLE。 關(guān)于虛擬函數(shù)表,有幾點(diǎn)必須聲明清楚:1. C+編譯時(shí)候編譯器會(huì)在含有虛函數(shù)的類中加上一個(gè)指
12、向虛擬函數(shù)表的指針vptr。 2. 從一個(gè)類別誕生的每一個(gè)對(duì)象,將獲取該類別中的vptr指針,這個(gè)指針同樣指向類的VTABLE。 因此類、對(duì)象、VTABLE的層次結(jié)構(gòu)可以用下圖表示。其中X類和Y類的對(duì)象的指針 都指向了X,Y的虛擬函數(shù)表,同時(shí)X,Y類自身也包含了指向虛擬函數(shù)的指針。#include class shape public: virtual void draw()coutshape:draw()endl; ;virtual void area() coutshape:area()endl; ; void fun() draw(); area(); ; ; class circle:
13、public shapepublic: void draw() coutcircle:draw()endl; virtual void adjust() coutcircle:adjust()Release(); 基本接口IUnknown每一個(gè)COM接口都派生于IUnknown。這個(gè)名字有點(diǎn)誤導(dǎo)人,其中沒有未知(Unknown)接口的意思。它的原意是如果有一個(gè)指向某COM對(duì)象的IUnknown指針,就不用知道潛在的對(duì)象是什么,因?yàn)槊總€(gè)COM對(duì)象都實(shí)現(xiàn)IUnknown。IUnknown 有三個(gè)方法:AddRef() 通知COM對(duì)象增加它的引用計(jì)數(shù)。如果你進(jìn)行了一次接口指針的拷貝,就必須調(diào)用一次這
14、個(gè)方法,并且原始的值和拷貝的值兩者都要用到。Release() 通知COM對(duì)象減少它的引用計(jì)數(shù)。QueryInterface() 從COM對(duì)象請(qǐng)求一個(gè)接口指針。當(dāng)coclass實(shí)現(xiàn)一個(gè)以上的接口時(shí),就要用到這個(gè)方法。當(dāng)你用CoCreateInstance()創(chuàng)建對(duì)象的時(shí)候,你得到一個(gè)返回的接口指針。如果這個(gè)COM對(duì)象實(shí)現(xiàn)一個(gè)以上的接口(不包括IUnknown),你就必須用QueryInterface()方法來獲得任何你需要的附加的接口指針從C+到COM客戶重用C+對(duì)象C+客戶重用C+對(duì)象功能介紹: 用字符串?dāng)?shù)組模擬數(shù)據(jù)庫管理系統(tǒng)的工作原理。 實(shí)現(xiàn)對(duì)“數(shù)據(jù)庫”的建立、刪除 讀、寫 表或記錄的定位
15、實(shí)現(xiàn)方法: 定義DB類,將定義類的.h文件單獨(dú)放在一個(gè)文件夾中,假裝自己是接口。文件夾起名為interface。 實(shí)現(xiàn)DB類,將實(shí)現(xiàn)類的.CPP文件單獨(dú)放在一個(gè)文件夾中,文件夾起名為object。 建一個(gè)VC+工程,將上面兩個(gè)文件加入工程,增加菜單映射函數(shù),實(shí)現(xiàn)菜單功能。生成C+對(duì)象CDB (Dbsev.h)class CDB public:HRESULT Read(short nTable, short nRow, LPTSTR lpszData);HRESULT Write(short nTable, short nRow, LPCTSTR lpszData);HRESULT Create
16、(short &nTable, LPCTSTR lpszName);HRESULT Delete(short nTable);HRESULT GetNumTables(short &nNumTables);HRESULT GetTableName(short nTable, LPTSTR lpszName);HRESULT GetNumRows(short nTable, short &nRows);private:CPtrArray m_arrTables; / Array of pointers to CStringArray (the database)CStringArray m_ar
17、rNames; / Array of table namespublic:CDB();#endifCDB類的實(shí)現(xiàn)文件DBsrv.cpp:#include stdafx.h#include .InterfaceDBsrv.h#define new DEBUG_NEW/ Database objectHRESULT CDB:Read(short nTable, short nRow, LPTSTR lpszData) CStringArray *pTable; pTable=(CStringArray*) m_arrTablesnTable; lstrcpy (lpszData, (*pTable
18、)nRow); return NO_ERROR;HRESULT CDB:Write(short nTable, short nRow, LPCTSTR lpszData) CStringArray *pTable; pTable=(CStringArray*) m_arrTablesnTable; pTable-SetAtGrow(nRow, lpszData); return NO_ERROR;HRESULT CDB:Create(short &nTable, LPCTSTR lpszName) CStringArray *pTable=new CStringArray; nTable=m_
19、arrTables.Add(pTable); m_arrNames.SetAtGrow(nTable, lpszName); return NO_ERROR;HRESULT CDB:Delete(short nTable) CStringArray *pTable; pTable=(CStringArray*) m_arrTablesnTable; delete pTable; m_arrTablesnTable=NULL; m_arrNamesnTable=; if (nTable=m_arrTables.GetSize()-1) m_arrTables.RemoveAt(nTable);m
20、_arrNames.RemoveAt(nTable); return NO_ERROR;客戶程序1、創(chuàng)建客戶程序,起名為DB。2、添加菜單項(xiàng): 建表:添加一個(gè)名稱為“Testing”的表到文檔的數(shù)據(jù)庫對(duì)象中。 寫表:寫一個(gè)字符串到新表的第一行。 讀表: 讀出新表第一行的內(nèi)容并放在CDBDoc:m_csData中,然后 由CDBView將它顯示在窗口客戶區(qū)。3、實(shí)現(xiàn)菜單函數(shù)4、顯示讀表內(nèi)容 pDC-TextOut(10,10,pDoc-m_csData);5、 添加對(duì)象代碼程序運(yùn)行效果演示將C+對(duì)象打包成DLLDB_cppdll要將對(duì)象的實(shí)現(xiàn)封裝成DLL,必須考慮如下事情: 成員函數(shù)的引出; U
21、nicode/ASCII兼容性。 引出函數(shù)的一個(gè)簡單方法是用_declspec(dllexport)例如:_declspec(dllexport) int MyFunction(int n);_declspec(dllexport)可用于任何函數(shù),包括類的成員函數(shù),它可以告訴編譯器將入口放進(jìn)引出函數(shù)表中。 要引出CDC類中的所有成員函數(shù),只需在每個(gè)成員函數(shù)之前加上_declspec(dllexport)。Unicode/ASCII兼容 問題的由來: 所有與DB工程相關(guān)的例程都可以創(chuàng)建成使用Unicode和使用ASCII。但是有一些函數(shù)的參數(shù)是字符串類型,以Unicode或ASCII形式編譯,得
22、到的二進(jìn)制文件將有所不同。所以應(yīng)將所有函數(shù)參數(shù)標(biāo)準(zhǔn)化為Unicode,因?yàn)閁nicode是ASCII的超集。步驟一:修改接口文件#define DEF_EXPORT _declspec(dllexport)class CDB / Interfaces public:DEF_EXPORT Read(short nTable, short nRow, LPWSTR lpszData);DEF_EXPORT Write(short nTable, short nRow, LPCWSTR lpszData);/ Implementation private: CPtrArray m_arrTables
23、; / pointers to CStringArray (the database) CStringArray m_arrNames; / Array of table namespublic:CDB(); 為CDB類的每個(gè)成員函數(shù)添加_declspec(dllexport) 聲明。 添加成員函數(shù)Release(),該函數(shù)在對(duì)象不再被使用刪除自己; 聲明類廠CDBSrvFactory; 聲明返回類廠對(duì)象的引出函數(shù)DllGetClassFactoryObject。步驟二:修改對(duì)象程序1、創(chuàng)建DLL工程框架 Win32 Dynamic-Link Library。起名為DB。2、添加對(duì)象文件DBS
24、rv.cpp和stdafx.h到工程。3、修改對(duì)象實(shí)現(xiàn)文件。在CDB對(duì)象的實(shí)現(xiàn)文件DBSrv.cpp中添加 CDB:Release()的實(shí)現(xiàn)代碼。ULONG CDB:Release() delete this;return 0;4、 實(shí)現(xiàn)CDBSrvFactory。新建DBSrvFactory.cpp及對(duì)象的引出函數(shù)DllGetClassFactoryObject。5、 將參數(shù)標(biāo)準(zhǔn)化為Unicode.6、 創(chuàng)建程序。生成引入庫文件(.LIB)和動(dòng)態(tài)鏈接庫文件(.DLL)。步驟三:修改客戶程序1、修改對(duì)象刪除方式。將CDBDoc:CDBDoc()中的 delete m_pDB 改成m_pDB-R
25、elease()2、 通過類廠創(chuàng)建對(duì)象CDB。修改CDBDoc:OnNewDocment()3、 將參數(shù)標(biāo)準(zhǔn)化為Unicode。4、 連接DLL。5、 創(chuàng)建客戶程序。將DB.DLL拷貝到客戶程序所在目錄下,編譯。運(yùn)行程序,觀看效果過渡問題:私有成員變量被暴露解決方案:抽象基類 即,將“接口”頭文件中定義的成員函數(shù)定義成虛函數(shù),將成員變量刪除。 將CDB改成 IDB,CDBSrvFactory改成IDBSrvFactory。第二步:修改對(duì)象程序 增加頭文件DBSRVIMP.H 其中包含dbsrv.h 其他部分也做相應(yīng)修改第三步:修改對(duì)象實(shí)現(xiàn)文件 將包含的頭文件dbsrv.h改成dbsrvimp.
26、h#include stdafx.h#include DBsrvImp.h“HRESULT CDBSrvFactory:CreateDB(IDB* ppvDBObject) *ppvDBObject=(IDB*) new CDB; return NO_ERROR; ULONG CDBSrvFactory:Release() delete this;return 0; HRESULT DEF_EXPORT DllGetClassFactoryObject(IDBSrvFactory * ppObject) *ppObject=(IDBSrvFactory*) new CDBSrvFactory;
27、 return NO_ERROR; 第四步:修改客戶程序 將CDBDoc的數(shù)據(jù)成員類型由CDB*改成IDB*public:IDB *m_pDB; 在CDBDoc:OnNewDocument函數(shù)中,將CDBSrvFactory*改成 IDBSrvFactory*第五步: 新生成DLL,拷貝到客戶程序下,運(yùn)行效果和原來一樣!改由COM庫裝載C+對(duì)象前面的示例中,DLL聲明了一個(gè)入口點(diǎn)DllGetClassFactoryObject,客戶程序調(diào)用此函數(shù)可以獲得類廠對(duì)象,再由類廠創(chuàng)建真正的對(duì)象DB。這樣做隱含的問題:如何在一個(gè)DLL中實(shí)現(xiàn)多個(gè)對(duì)象(類)。解決辦法: 為每一個(gè)準(zhǔn)備引出的類提供一個(gè)入口點(diǎn);
28、 給一個(gè)標(biāo)準(zhǔn)入口點(diǎn)傳遞一個(gè)額外參數(shù),表明所需要的類。事實(shí)上,COM正是采用的第二種做法!它使用用統(tǒng)一的類廠獲取函數(shù):STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void* ppObject)REFCLSID rclsid 是個(gè)128位的二進(jìn)制數(shù)字標(biāo)識(shí),做為類標(biāo)識(shí)。REFIID riid 也是個(gè)128位的二進(jìn)制數(shù)字標(biāo)識(shí),做為類的接口標(biāo)識(shí)。void* ppObject 是返回的對(duì)應(yīng)類的類廠指針?,F(xiàn)在的例子實(shí)際上只有一個(gè)接口,如果一個(gè)類中嵌有多個(gè)類,那么內(nèi)部的每一個(gè)類就是一個(gè)接口,這就是為什么除了類標(biāo)識(shí)還要有接口標(biāo)識(shí)的原因。第一步:修改接口文件 在dbsrv.h中增加類ID和接口ID的說明 刪除DllGetClassFactoryObject,為使用統(tǒng)一的DllGetClassObject做準(zhǔn)備 第二步: 修改對(duì)象程序 在dbsrvfact.cpp中定義GUID。在dbsrv
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 凍飲羹行業(yè)行業(yè)發(fā)展趨勢及投資戰(zhàn)略研究分析報(bào)告
- 2024年生物環(huán)保行業(yè)發(fā)展前景預(yù)測及投資戰(zhàn)略研究報(bào)告
- 2025年中國高壓電機(jī)行業(yè)市場調(diào)研及未來發(fā)展趨勢預(yù)測報(bào)告
- 2025年信號(hào)燈珠項(xiàng)目投資可行性研究分析報(bào)告
- 2025年動(dòng)力鋰電池專用石墨粉項(xiàng)目投資可行性研究分析報(bào)告
- 繡花窗簾布行業(yè)市場發(fā)展及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
- 2024-2029年中國工業(yè)大數(shù)據(jù)產(chǎn)業(yè)發(fā)展前景與投資戰(zhàn)略規(guī)劃分析報(bào)告
- 2025年中國稀土靶材行業(yè)市場深度評(píng)估及投資戰(zhàn)略規(guī)劃報(bào)告
- 2025年手動(dòng)起動(dòng)器行業(yè)深度研究分析報(bào)告
- 固定焦點(diǎn)鏡頭行業(yè)行業(yè)發(fā)展趨勢及投資戰(zhàn)略研究分析報(bào)告
- 二十屆三中全會(huì)精神應(yīng)知應(yīng)會(huì)知識(shí)測試30題(附答案)
- 員工聘用合同范本(2024版)
- DL∕T 5161.6-2018 電氣裝置安裝工程質(zhì)量檢驗(yàn)及評(píng)定規(guī)程 第6部分:接地裝置施工質(zhì)量檢驗(yàn)
- 《烏有先生歷險(xiǎn)記》原文及翻譯
- 部編版道德與法治六年級(jí)下冊(cè)課程綱要
- DL-T439-2018火力發(fā)電廠高溫緊固件技術(shù)導(dǎo)則
- 人員測評(píng)方案
- 簡易呼吸器的使用和心肺復(fù)蘇-3
- 2024年河北省九地市中考數(shù)學(xué)摸底試卷
- (正式版)JBT 14787-2024 可同步限矩型液力耦合器
- 流行音樂(中國)
評(píng)論
0/150
提交評(píng)論