版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、面向?qū)ο蟪绦蛟O(shè)計的基本概念面向?qū)ο蟪绦蛟O(shè)計的基本概念2010-04-1420:01前言:面向?qū)ο蟪绦蛟O(shè)計(Object-OrientedProgramming,以下簡稱OOP)!種起源于六十年代的Simula語言,發(fā)展已經(jīng)將近三十年的程序設(shè)計思想。其自身理論已經(jīng)十分完善,并被多種面向?qū)ο蟪绦蛟O(shè)計語言(Object-OrientedProgrammingLanguage,以下簡稱OOPL決現(xiàn)。如果把Unix系統(tǒng)看成是國外在系統(tǒng)軟件方面的文化根基,那么Smalltalk語言無疑在OOPL域和Unix持有相同地位。由于很多原因,國內(nèi)大部分程序設(shè)計人員并沒有很深的OO似及OOPL!論,很多人從一開始學(xué)
2、習(xí)到工作很多年都只是接觸到c/c+,java,vb,delphi等靜態(tài)類型語言,而對純粹的OO刖想以及作為OOPL艮基的Smalltalk以及動態(tài)類型語言知之甚少,不知道其實世界上還有一些可以針對變量不綁定類型的編程語言。而這些對比卻是深刻理解OO理論的重要部分,而國內(nèi)這方面的資料也為數(shù)不多。故把自己的一些OC習(xí)心得寫下來做為一個系歹0文章(一共三篇,第一篇描敘OOP勺一些基本但容易被誤解的理論,第二篇主要說明各種OOPL典化和發(fā)展以及對于OOP理論的支持,第三篇主要是說模式和組件在OO仲的地位以及展望OOP勺未來),由于文章描敘的只是自己對于OOP/OOPL理解,錯誤以及淺薄之處在所難免,只
3、是希望對大家能起到拋磚引玉的作用。淺析OO的基石從抽象說起B(yǎng)ooch曾經(jīng)在他自己的。頃域內(nèi)的名著Booch94中開篇就論敘到了復(fù)雜性是軟件開發(fā)過程中所故有的特質(zhì)。而人們處理復(fù)雜性的最根本武器就是抽象。廣義的抽象代表的是對復(fù)雜系統(tǒng)的簡化描敘或規(guī)格說明,為了突出系統(tǒng)的本質(zhì)屆性而故意忽略其中的非實質(zhì)性細節(jié)。”一個概念只有當(dāng)能被最終用來實現(xiàn)的機制獨立的描敘,理解,分析時,才將這個概念限定為抽象的概念”。而Booch也給出了他心目中關(guān)于OO域內(nèi)的狹義抽象定義:抽象表示一個對象與其他所有對象相區(qū)別的基本特征,因此提供了同觀察者角度有關(guān)的活晰定義的概念界限?!币虼?,根據(jù)不同觀察角度,我們可以針對OOP合出不
4、同級別的抽象層次。通常,面對一個典型的面向?qū)ο蟪绦?,Budd2002將其分成五個抽象層,分別覆蓋了OO仲的分析,設(shè)計與編程的各個階段:1, 最高級別的抽象層上,程序被看成是由很多相互作用并且遵守契約的對象所組成的對象集合。對象之間相互合作完成程序的計算任務(wù)。這個抽象級別上的典型代表就是設(shè)計模式思想(DesignPattern)。2, 第二個抽象層就是一個對象集單元,也就是一群定義之間有相互聯(lián)系的對象,在程序設(shè)計語!級別來看Java中是packages,C+中是namespace。這個抽象級別上的典型代表就是模塊化思想(Modularity)。3, 第三個抽象層所代表的是典型的OOP莫式:客戶/
5、服務(wù)器模型,這主要是用來抽象兩個對象之間的互交過程。在這個抽象級別上的典型代表就是對象之間的消息機制(MessagePassing)。4, 第四個抽象層就是針對一組相似對象定義一個類作為生成對象的棋板,類定義了對象的對外使用接口以及繼承對象所需的內(nèi)部繼承接口,而這個抽象層次的典型代表就是接口編程(InterfaceProgramming)。5, 第五個抽象層就是實現(xiàn)一個類所需要的方法和成員變量的實現(xiàn)(Implementation)。在這里OOP終和POP(Procedure-OrientedProgramming)相融合。當(dāng)然,我們可以根據(jù)各自的觀察角度劃分成更細的抽象層次比如說針對第五層抽象
6、用到的POPS論,我們還可以進一步的劃分出控制抽象(三種完全描敘圖靈機計算模型所需要的控制結(jié)構(gòu))以及數(shù)據(jù)抽象(ADTs)等等,并由此繼續(xù)下去(如果你的想象力足夠豐富的話:)。什么是OOP?OOP勺許多原始思想都來之于Simula語言,并在Smalltalk語言的完善和標(biāo)準(zhǔn)化過程中得到更多的擴展和對以前的思想的重新注解。可以說OC想和OOP乎是同步發(fā)展相互促進的。與函數(shù)式程序設(shè)計(functionalprogramming)和邏輯式程序設(shè)計(logic-programming)所代表的接近于機器的實際計算模型所不同的是,OOP!乎沒有引入精確的數(shù)學(xué)描敘,而是傾向于建立一個對象模型,它能夠近似的反
7、映應(yīng)用領(lǐng)域內(nèi)的實體之間的關(guān)系,其本質(zhì)是更接近于一種人類認知事物所采用的哲學(xué)觀的計算模型。由此,導(dǎo)致了一個自然的話題,那就是OO倒底是什么?D&T1988B.S1991.。在OO仲,對象作為計算主體,擁有自己的名稱,狀態(tài)以及接受外界消息的接口。在對象模型中,產(chǎn)生新對象,舊對象銷毀,發(fā)送消息,響應(yīng)消息就構(gòu)成OOP+算模型的根本。對象的產(chǎn)生有兩種基本方式。一種是以原型(prototype)對象為基礎(chǔ)產(chǎn)生新的對象。一種是以類(class)為基礎(chǔ)產(chǎn)生新對象。原型的概念已經(jīng)在認知心理學(xué)中被用來解釋概念學(xué)習(xí)的遞增特性,原型模型本身就是企圖通過提供一個有代表性的對象為基礎(chǔ)來產(chǎn)生各種新的對象,并由此繼續(xù)產(chǎn)生更符
8、合實際應(yīng)用的對象。而原型-委托也是OO仲的對象抽象,代碼共享機制中的一種。一個類提供了一個或者多個對象的通用性描敘。從形式化的觀點看,類與類型有關(guān),因此一個類相當(dāng)于是從該類中產(chǎn)生的實例的集合。而這樣的觀點也會帶來一些矛盾,比較典型的就是在繼承體系下,子集(子類)對象和父集(父類)對象之間的行為相融性可能很難達到,這也就是OOW常被引用的-子類型(subtype)不等于子類(subclass)Budd2002。而在一種所有皆對象的世界觀背景下,在類模型基礎(chǔ)上還誕生出了一種擁有元類(metaclass)的新對象模型。即類本身也是一種其他類的對象。以上三種根本不同的觀點各自定義了三種基于類(clas
9、s-based),基于原型(prototype-based)和基于元類(metaclass-based)的對象模型。而這三種對象模型也就導(dǎo)致了許多不同的程序設(shè)計語言(如果我們暫時把靜態(tài)與動態(tài)的差別放在一邊)。是的,我們經(jīng)常接觸的C+,Java都是使用基于類的對象模型,但除此之外還有很多我們所沒有接觸的OOPIX用了完全不一樣的對象模型,他們是在用另外一種觀點訟釋OOP勺內(nèi)涵。什么是類型(type)?類型以及類型系統(tǒng)的起源以及研究與發(fā)展是獨立于OOP勺。早在五十年代的FORTRAN言編譯器實現(xiàn)中,就已經(jīng)采用類型系統(tǒng)作為類型檢查的一種手段。廣義的類型一般被定義為一種約束,也就是一種邏輯公式。而在對
10、類型的研究過程中產(chǎn)生多種方法,比如C&W1985等。而代數(shù)方法(algebraicapproach)是一種非常好的建立類型的形式化規(guī)范的方法。代數(shù)中的一個類型對應(yīng)于一系列元素,在它們之上定義代數(shù)操作。同時在此基礎(chǔ)上二階入演算已經(jīng)被用于繼承和棋板所支持的模型。在上面兩種方法中,類型被認為是一系列滿足確定約束條件的元素,更抽象的方式可以把一個類型當(dāng)作規(guī)定一個約束條件,如果我們規(guī)定的約束條件越好,相對應(yīng)的被定義元素的集合就越精密,所以邏輯公式(logicalformulas)就成為描敘類型特征的最合適工具。在這里,我們不想深入的探究對于類型理論的各種不同的數(shù)學(xué)模型,我們需要明白的是類型(type)以
11、及類型理論這個在編程語言中經(jīng)常應(yīng)用到的概念的內(nèi)涵是極其豐富的,而其自身理論的發(fā)展并非局限于OO比中,但當(dāng)兩者相結(jié)合的時候就對我們的程序觀產(chǎn)生了巨大的影響。類(class),類型(type),接口(interface)這三個概念是在OO叫出現(xiàn)頻率最多,也最容易混淆的。而對于這三個概念的澄活也是文章寫作的初衷。讓我們先看看大師們對于這三個概念的描敘-ThefundamentalunitofprogramminginJavaprogramminglanguageistheclass,butthefundamentalunitoftheobject-orienteddesignisthetype.wh
12、ileclassesdefinetypes,itisveryusefulandpowerfultobeabletodefineatypewithoutdefiningaclass.Interfacedefinetypesinanabstractformasacollectionofmethodsorothertypesthatformthecontractforthetype.”Jams2000。InC+,AclassisauserdefinitetypeB.S1998。Atypeisanameusedtodenoteaparticularinterface-Anobjectmayhavema
13、nytypes,andwidelydifferentobjectscanshareatype.Partofanobjectsinterfacemaybecharacterizedbyonetype,andotherpartsbyothertypes.Twoobjectsofthesametypeneedonlysharepartsoftheirinterface.Interfacecancontainotherinterfaceassubset.Wesaythatatypeisasubtypeofanotherifitsinterfacecontaintheinterfaceofitssupe
14、rtype.OftenwespeakofasubtypeinheritingtheinterfaceofitssupertypeGamma1995在其中,一共出現(xiàn)了四個概念:類(class),類型(type),接口(interface)以及契約(contract)。這里我們說到的類型和上面提到的類型有所不同,是狹義的OO叫的類型。為了理解這幾個概念,我先劃分出三個概念域:一個是針對現(xiàn)實世界的,一個是針對特定程序設(shè)計范型的(在這里就是OC設(shè)計范型),最后一個是針對編譯器實現(xiàn)的。也就是說,在現(xiàn)實世界中的概念必須有一種手段映射到。砒型中去,而OO范型中的概念也應(yīng)該在編譯器實現(xiàn)中有相同的概念對應(yīng)。由此
15、,我們可以這樣說,類是做為現(xiàn)實世界中的概念,而傳統(tǒng)的OOPLTK會提供class關(guān)鍵字來表示對現(xiàn)實世界模擬的支持。而接口,是作為OOS序設(shè)計范型中與類對應(yīng)的一個概念。在OO設(shè)計中,我們所要做的就是針對接口進行設(shè)計和編程,而接口的實質(zhì)含義就是對象之間的一種契約。而類型就是編譯器實現(xiàn)中針對類和接口所定義的對應(yīng)概念??梢赃@樣說,類是現(xiàn)實世界中存在的客觀概念,是唯物的。接口是設(shè)計人員定義出來的,存在于設(shè)計人員心中的概念,是唯心的。而類型是類和接口這兩種概念的編譯器實現(xiàn)的映射概念,也是唯物的。類型主要是用來指導(dǎo)編譯器的類型檢查的謂詞,類是創(chuàng)建現(xiàn)實對象的棋板,接口是OO設(shè)計中的關(guān)鍵概念。這三個概念相互區(qū)別
16、(分別位于不同的概念域),乂相互聯(lián)系(都是代表相同的概念的不同概念域的映射)。有了上面的理解,我們看看下面最常見的Java語句:peoplea=newman();這代表了什么狒序員向編譯器聲明了一個people類型(type)的對象變量a,而對象變量a本身卻指向了一個man類(class)的實體(而在編譯器中理解是對象變量a指向了一個類型為man的實體)。再讓我們回到Jams2000,其中句子的根本含義我們可以概括如下:聲明一個類或者一個接口都同時向編譯器注冊了一個新的類型,而此類或者接口以及類型都是共享同樣的一個名字。也就是說。編譯器所能理解的全部都是類型,而程序員的工作是把現(xiàn)實中的類概念轉(zhuǎn)
17、化為設(shè)計中的接口概念,而編譯器對應(yīng)于上兩種概念都有直接的支持,那就是一個類聲明或者接口聲明在編譯器的理解來看就是一個類型聲明。但是反過來卻不一定成立。一個類可以有多個接口(一個類完全有可能實現(xiàn)了設(shè)計人員的多個契約條件),同時也就可能有多個類型(因為類型不過是接口這個設(shè)計域內(nèi)的概念在編譯器中的實現(xiàn))。多態(tài),替換原則,對象切割多態(tài)作為OO中的核心機制之一擁有著豐富的內(nèi)涵。顧名思義,多態(tài)就是一種名稱多種形態(tài)的意思。其主要有三種形式:函數(shù)多態(tài),對象變量多態(tài),泛型多態(tài)。函數(shù)多態(tài)主要包括函數(shù)重載(overload)和改寫(overriding)。泛型多態(tài)(genericity)主要是提供了一種創(chuàng)建通用工具
18、的方法,可以在特定的場合將其特化。在這里,我們重點要考量的是對象變量多態(tài)。在理解對象變量多態(tài)之前,我們首先了解一下0誠心機制之一的替換原則。靜態(tài)類型的OOPL勺一個特征就是一個變量所包含的值(value)的類型可能并不等于這個變量所聲明的類型,在傳統(tǒng)的編程語言中并不具備這樣的特征,因為我們不可能把聲明為整型的變量賦上字符申的變量值。而替換原則發(fā)生作用的情況就隱含的描敘了兩種不同類型所具有的關(guān)聯(lián)-類型繼承。BarbaraLiskov曾經(jīng)這樣描敘替換原則以及起作用的類型之間的關(guān)聯(lián):對于類型為S的每個對象s,存在一個類型為T的對象t,對于根據(jù)類型T所定義的所有程序P,如果用對象s替換對象t,程序P的
19、行為保持不變,那么類型S就是類型T的子類型Liskov1988在理解了多態(tài)以及替換原則后,我們可以繼續(xù)深入理解繼承與替換原則相結(jié)合所帶來的新的觀點??梢哉f繼承與替換原則的引入影響了幾乎所有的OOPL包括類型系統(tǒng),值語義/引用語義,對象內(nèi)存空間分配等等。下面,我將試圖逐步的撥開其中的各種因果。首先考慮,peoplea;這樣的代碼在編譯器中將如何實現(xiàn)?可以肯定是首先將把類型people綁定到對象a上,然后必須為對象a分配空間。同時,我們創(chuàng)建people的子類man由于manISApeople。根據(jù)多態(tài)以及替換原則,我們當(dāng)然可以讓對象a保存一個man類型的值(這就是替換原則的表現(xiàn))。這是一種直觀的描
20、敘,但在編程語言的實現(xiàn)過程中就出現(xiàn)一些困難。我們知道繼承是一種擴展接口與實現(xiàn)的方式,那么我們就很難保證man類型不對people類型做擴展,而一旦做出擴展,我們?nèi)绾文苡么鎯eople對象的空間去存儲man類型的對象值呢?peoplea;manb=newman();a=b;這樣的代碼將首先把b對象進行切割,然后再存儲到a對象空間去。然而這并不是我們所期望的。那么,為了支持OOP勺繼承,多態(tài),替換原則,但卻需要避免對象切割的發(fā)生,面對對象a我們將采用何種分配空間模型呢?常用的有下面三種方式:1, 只為a分配基類people的存儲空間,不支持對象多態(tài)以及替換原則。這樣的模型內(nèi)存分配緊湊,存儲效率很
21、高。2, 分配繼承樹中的最大類對象所需要空間(在這里是man類的對象值空間),這樣的模型簡單,同時可以實現(xiàn)多態(tài)和替換原則而避免對象切割問題,但是十分浪費內(nèi)存空間十分明顯。3, 只分配用于保存一個指針?biāo)枰拇鎯臻g,在運行時通過堆來分配對象實際類型所需要的空間大小,這樣也可以實現(xiàn)多態(tài)和替換原則而避免對象切割問題。(也就是說a只是一個對象的引用,而不是真實的對象,真實對象的生成必須靠程序員顯式的聲明)。對于上面提到的三種內(nèi)存模型,1和3都被一些程序設(shè)計語言所采用。相信說到這里,大家應(yīng)該開始慢慢明白了。是的,C+乍為C語言的繼承者,對于效率的追求迫使它必須采用第一種最小靜態(tài)空間分配的方式,由于基于
22、??臻g的程序運行效率要比基于堆空間的程序運行效率高出許多,所以C+院許用??臻g保存對象,但同時也允許堆空間保存對象,可以說C+兜采用了1和3兩種相混合的內(nèi)存模型,而C+州基于1內(nèi)存模型的對象,也就是說基于棧內(nèi)存空間的對象是沒有辦法體現(xiàn)多態(tài)和替換原則的(請思考一下在C+州什么對象是基于棧的),而基于3內(nèi)存模型的對象將支持多態(tài)和替換原則(乂想一想在C+中什么對象是基于堆的)。這里,我們終于可以揭開第一層迷霧了,很多人都知道在C+州只有指針和引用才能支持對象的多態(tài)行為,但是為什么會如此?上面做出了最好的解釋。Java語舌由于設(shè)計理念和C+用著很大的區(qū)別,它米用的是第3種對象棋型,一切對象(除了基本類
23、型對象)都是基于堆分配的。這也是Java語言必須采用虛擬機的原因所在。在C+州很大一部分對象是不需要程序員進行管理的(靜態(tài)空間對象),而在Java中,如果不采用虛擬機機制,所有的對象都需要程序員管理,而這樣的開發(fā)代價將是巨大而不現(xiàn)實的。這也就揭開了第二層迷霧,當(dāng)我們在對比C+新日Java語言的時候總是為虛擬機是否有其價值而爭論不休,但當(dāng)你拋開所謂的好與不好的簡單討論,進入到其語言本身的內(nèi)在對象存儲本質(zhì)的時候,也許對于各種聲音才會有一個屆于自己的活醒認識。讓我們繼續(xù)望下走,不同的對象內(nèi)存分配模型直接影響到其程序設(shè)計語言的賦值的含義。在各種編程語言中,賦值可以給出兩種不同的語義解釋:復(fù)制語義和指針
24、語義。很明顯,由于C+找持兩種相混合的對象存儲模型(但是默認的存儲方式是棧存儲),所以在C+州默認賦值語義米用的是前者,但C+W時提供了指針語義的功能支持(在拷貝構(gòu)造函數(shù)和=運算符重載中用戶進行自定義)而在Java中采用的是后者。這也就是我們揭開的最后一道迷霧,不同的對象存儲模型直接導(dǎo)致了不同的賦值語義。面向?qū)ο蟮挠嬎隳P秃涂捎嬎阈跃幊叹褪怯糜嬎闼枰闹噶顦?gòu)成一種運算裝置,無論我們的程序設(shè)計思想以及程序設(shè)計語言如何發(fā)展和提高,最終我們所使用的底層計算數(shù)學(xué)模型并沒有改變。但高級程序設(shè)計語言給我們帶來的變革是在其語言環(huán)境中構(gòu)建起了一個全新的,更抽象的虛擬計算模型。Smalltalk語言引入的對象
25、計算模型從根本上改變了以前的傳統(tǒng)計算模型,以前的計算模型突出的是順序計算過程中的機器狀態(tài),而現(xiàn)在的對象計算模型突出的對象之間的協(xié)作其計算結(jié)果由參加計算的所有的對象的狀態(tài)總體構(gòu)成。而由于對象本身具有自身狀態(tài),我們也可以把一個對象看成是一個小的計算機器。這樣,面向?qū)ο蟮挠嬎隳P途脱葑兂闪嗽S多小的計算機器的合作計算模型。圖靈機作為計算領(lǐng)域內(nèi)的根本計算模型,精確的抓住了計算的要點:什么是可計算的,計算時間和空間存儲大小開銷有多大。計算模型活楚的界定了可計算性的范圍,也就界定了哪些問題是可求解,哪些問題是不可求解的。OOF%程序員提供了一種更加抽象和易于理解的新的計算模型,但其本身并沒有超越馮.諾依曼體
26、系所代表的圖靈機數(shù)學(xué)計算模型。所以我們不能期望00甬它幫助我們解決更多的問題,或者減少運算的復(fù)雜度。但OOFW能幫助我們用一種更容易被我們所理解和接受的方式去描敘和解決現(xiàn)實問題。結(jié)束這篇文章做為這個系列的第一篇,對于OO仲的許多核心概念和機制進行了有益的討論,作者衷心的希望通過這篇文章能夠讓大家對于OOFW更深入的理解,同時明白OOP乍為已經(jīng)發(fā)展將近三十年的程序設(shè)計思想,其自身豐富的理論內(nèi)涵不是單單學(xué)習(xí)幾門OOPIM可以領(lǐng)悟。最后期望本文能實現(xiàn)了它的初衷-拋磚引玉。Reference:D&T1988:TypeTheoriesandObject-OrientedprogrammingbyScottDanforthandChrisTomlinsononACMComputingSurveysVol.20No.1March1988Liskov1988:DataAbstractionandHierarchybyBarbaraLiskovonSigplanNotices,23(5),1988C&W1985Onunderstandingtypes,dataabstraction,andpolymorphismbyCardelli.LandWegne
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年質(zhì)檢工具項目可行性研究報告
- 2025-2030年(全新版)中國膜級母料聚酯切片行業(yè)發(fā)展?fàn)顩r及投資前景研究報告
- 2025-2030年中國高分子發(fā)泡材料市場發(fā)展?fàn)顩r及營銷戰(zhàn)略研究報告
- 2025-2030年中國降龍涎香醚行業(yè)深度評估及未來發(fā)展趨勢預(yù)測報告
- 2025-2030年中國金屬波紋管行業(yè)運營狀況及發(fā)展前景預(yù)測報告
- 供應(yīng)鏈突發(fā)事件應(yīng)對考核試卷
- 2025年度牛奶加工廠原料供應(yīng)合同書
- 互聯(lián)網(wǎng)行業(yè)中的數(shù)字身份驗證趨勢考核試卷
- 2025年度電工安全應(yīng)急救援物資采購合同
- 2025年度綠色稻谷質(zhì)量安全檢測服務(wù)合同
- 高一學(xué)生心理素質(zhì)描述【6篇】
- 給男友的道歉信10000字(十二篇)
- 2020年高級統(tǒng)計實務(wù)與案例分析真題及答案
- 全面質(zhì)量管理(TQM)基本知識
- 練字本方格模板
- 產(chǎn)品供貨質(zhì)量保障措施
- 電力電纜高頻局放試驗報告
- JJG 517-2016出租汽車計價器
- JJF 1914-2021金相顯微鏡校準(zhǔn)規(guī)范
- GB/T 32045-2015節(jié)能量測量和驗證實施指南
- GB/T 10001.6-2021公共信息圖形符號第6部分:醫(yī)療保健符號
評論
0/150
提交評論