




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第8章繼承第8章繼承重載方法8.3通過繼承擴展:添加新的實例變量8.4通過繼承擴展——添加新方法8.2一切從根類開始8.1抽象類8.528.1一切從根類開始在第三章“類,對象和方法”中學過父類的概念。父類自身也可以有父類。沒有父類的類位于類層次結構的最頂層,稱為根類。在Objective-C中,允許定義自己的根類,但通常你不想這么做,而是想要利用現(xiàn)有的類。至此我們所定義的類都屬于名為NSObject的根類的派生類,這個根類通常如下在接口文件中指定:@interfaceFraction:NSObject...@end類Fraction就是從類NSObject派生來的。因為NSObject是層次結構的最頂端(也就是,它上面沒有任何類),因此稱為根類。類Fraction稱為子或子類(subclass)。從術語的角度而言,可以將一個類稱作子類和父類。相似的,還可以將類稱為子類和超類。要定義一個新類(不是一個新的根類),該類都會繼承一些屬性。例如,很明顯父類的所有實例變量和方法都成為新類定義的一部分。這意味著子類可以直接訪問這些方法和實例變量,就像直接在類定義中定義了一樣。3.8.1一切從根類開始舉一個例子,有助于解釋繼承這個概念。下面是一個名為ClassA的對象的聲明,它有個方法initVar:@interfaceClassA:NSObject{intx;}-(void)initVar;@end
initVar方法簡單地把100賦值給ClassA的實例變量:@implementationClassA-(void)initVar{x=100;}@end4.8.1一切從根類開始現(xiàn)在再定義一個名為ClassB的類:@interfaceClassB:ClassA-(void)printVar;@end聲明的第一行:@interfaceClassB:ClassA說明ClassB并非NSObject的子類,而是ClassA的子類。所以,盡管ClassA的父類或超類是NSObject,但是ClassB的父類確實ClassA。根類沒有超類,而ClassB沒有子類。因此ClassA是NSObject的子類,而ClassB是ClassA的子類,也是NSObject的子類。同樣,NSObject是ClassA的超類,也是ClassB的超類。@interfaceClassB:ClassA-(void)printVar;@end@implementationClassB-(void)printVar{NSLog(@”x=%i”,x);}@end5.8.1一切從根類開始雖然在ClassB中沒有定義任何實例變量,但是可以通過printVar方法輸出實例變量x的值。這是由于ClassB是ClassA的子類,因此它繼承ClassA的所有實例變量。通過把它集中放在一個完整的程序例子中,看看它的工作方式。代碼清單8-1---------------------------------------------------------------------------------------------------//Simpleexampletoillustrateinheritance#import<Foundation/Foundation.h>//ClassAdeclarationanddefinition@interfaceClassA:NSObject{intx;}-(void)initVar;@end@implementationClassA-(void)initVar{x=100;}@end6.8.1一切從根類開始//ClassBdeclarationanddefinition@interfaceClassB:ClassA-(void)printVar;@end@implementationClassB-(void)printVar{NSLog(@”x=%i”,x);}@endintmain(intargc,char*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];ClassB*b=[[ClassBalloc]init];[binitVar];//willuseinheritedmethod[bprintVar];//revealvalueofx;[brelease];[pooldrain];return0;}輸出:x=1007.8.1一切從根類開始記住,繼承的概念作用于整個繼承鏈。因此,如果如下所示定義一個父類是ClassB的新類ClassC:@interfaceClassC:ClassB;...@end那么ClassC將繼承ClassB的所有方法和實例變量,同時也一次繼承ClassA的所有方法和實例變量,它依次繼承NSObject的所有方法和實例變量。一定要理解一下的事實:類的每個實例都擁有自己的實例變量,即使這些實例變量是繼承來的。因此,對象ClassC與對象ClassB具有完全不同的實例變量。8.8.1一切從根類開始
找出正確的方法
向對象發(fā)送消息時,你可能想知道如何選擇正確的方法來應用到該對象。規(guī)則其實很簡單。首先,檢查該對象所屬的類,以查看在該類中是否明確定義了一個具有指定名稱的方法。如果有,就是用這個方法。如果這里沒有定義,就檢測它的父類。如果父類有定義,就用這個方法,否則繼續(xù)尋找。知道發(fā)現(xiàn)下面兩種情況中的一種,才會檢測父類:發(fā)現(xiàn)包含指定的方法的類,或者一直搜索到根類也沒有發(fā)現(xiàn)任何方法。如果是第一種情況,就會停止查找,如果是第二種情況,說明存在問題,就會生成類似下面的警告消息:warning:‘ClassB’maynotrespondto‘-inity’在這個例子中,你無意中向類ClassB傳遞了一條名為inity的消息,編譯器告知你:該類型的類不能響應這種方法。同樣,這是在檢測ClassB的方法及知道根類的父類的方法之后確定的。9.第8章繼承重載方法8.3通過繼承擴展:添加新的實例變量8.4通過繼承擴展——添加新方法8.2抽象類8.5一切從根類開始8.1108.2通過繼承擴展——添加新方法繼承通常用于擴展一個類。舉個例子,假設你剛接受一項任務:開發(fā)一些處理2D圖像對象的類?,F(xiàn)在,只考慮矩形。實際上,回顧第4章“數(shù)據(jù)類型和表達式”的練習7,從一下例子開始@interface部分:@interfaceRectangle:NSObject{intwidth;intheight;}@propertyintwidth,height;-(int)area;-(int)perimeter;@end當前的方法可以設置矩形的寬與高,返回它們的值并計算其面積和周長。再添加一個方法,允許你使用相同的消息來設置矩形的寬度和長度值,如下:-(void)setWidth:(int)wandHeight:(int)h;11.8.2通過繼承擴展——添加新方法假設將新類聲明鍵入名為Rectangle.h的文件。實現(xiàn)文件Rectangle.m將如下面所示:#import“Rectangle.h”@implementationRectangle@synthesizewidth,height;-(void)setWidth:(int)wandHeight:(int)h{width=w;height=h;}-(int)area{returnwidth*height;}-(int)perimeter{return(width+height)*2;}@end12.8.2通過繼承擴展——添加新方法代碼清單8-2顯示了一個測試它的main例程。代碼清單8-2---------------------------------------------------------------------------------------------------#import“Rectangleh”#import<stdio.h>intmain(intargc,char*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];Rectangle*myRect=[[Rectanglealloc]init];[myRectsetWidth:5andHeight:8];NSLog(w=%i,h=%i”,myRect.width,myRect.height);NSLog(@”Area=%i,Perimeter=%i”,[myRectarea],[myRectperimeter]);[myRectrelease];[pooldrain];return0;}輸出:Rectangle:w=5,h=8Area=40,Perimeter=2613.8.2通過繼承擴展——添加新方法處理矩形之后,假設現(xiàn)在需要處理正方形。可以定義一個名為Square的新類,并在其中定義同Rectangle類相似的方法。或者,認識到正方形只是長方形的特例。因此,簡單的處理方法就是定義一個名為Square的新類,并使它成為Rectangle的子類。這樣除了定義自己的方法和變量之外,可以使用Rectangle類中的所有方法和變量?,F(xiàn)在可能要添加的唯一方法可能是將正方形的邊設置特定的值。代碼清單8-3顯示了Square類的接口文件和實現(xiàn)文件。代碼清單8-3Square.h接口文件---------------------------------------------------------------------------------------------------#import“Rectangle.h”@interfaceSquare:Rectangle-(void)setSide:(int)s;-(int)side;@end14.8.2通過繼承擴展——添加新方法代碼清單8-3Square.m實現(xiàn)文件---------------------------------------------------------------------------------------------------#import“Square.h”@implementationSquare:Rectangle-(void)setSide:(int)s{[selfsetWidth:sandHeight:s];}-(int)side{returnwidth;}@end
注意此處所作的工作。你將Square定義為Rectangle的子類,這是在頭文件Rectangle.h中聲明的。這里不必添加任何實例變量,但是添加了兩個名為setSide和side的新方法。15.8.2通過繼承擴展——添加新方法代碼清單8-3測試程序---------------------------------------------------------------------------------------------------#import“Square.h”#import<Foundation/Foundation.h>intmain(intargc,char*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];Square*mySquare=[[Squarealloc]init];[mySquaresetSide:5];NSLog(@”Squares=%i”,[mySquareside]);NSLog(@”Area=%i,Perimeter=%i”,[mySquarearea],[mySquareperimeter]);[mySquarerelease];[pooldrain];return0;}輸出:Squares=5Area=25,Perimeter=2016.8.2.1Point類和內存分配Rectangle類只存儲矩形大小。在實際的圖形應用中,可能需要保存各種附加消息,如:矩形的填充色,線條顏色,窗口中的位置等待。可以方便的擴展這些類來處理這些情況?,F(xiàn)在,處理矩形原點的概念。假設“原點”是指笛卡爾坐標系(x,y)中矩形左下角的位置。可以擴展Rectangle類,將矩形原點(x,y)保存為兩個不同的值。在開發(fā)圖形應用程序的過程中,要處理很多坐標,因此要定義一個名為XYPoint的類。#import<Foundation/Foundation.h>@interfaceXYPoint:NSObject{intx;inty;}@propertyintx,y;-(void)setX:(int)xValandY:(int)yVal;@end17.8.2.1Point類和內存分配回到Rectangle類。希望能夠存儲矩形的原點,所以,必須想Rectangle類的定義添加另一實例變量origin:@interfaceRectangle:NSObject{intwidth;intheight;XYPoint*origin;}...18.8.2.2@class指令現(xiàn)在可以設置矩形的寬,高及原點。首先,完整的看一下接口文件Rectangle.h:#import<Foundation/Foundation.h>@classXYPoint;@interfaceRectangle:NSObject{intwidth;intheight;XYPoint*origin;}@propertyintwidth,height;-(XYPoint*)origin;-(void)setOrigin:(XYPoint*)pt;-(void)setWidth:(int)wandHeight:(int)h-(int)area;-(int)perimeter;@end19.8.2.2@class指令代碼清單8-4Rectangle.m添加的方法---------------------------------------------------------------------------------------------------#import“XYPoint.h”-(void)setOrigin:(XYPoint*)pt{origin=pt;}-(XYPoint*)origin{returnorigin;}@end20.8.2.2@class指令代碼清單8-4XYPoint.h接口文件---------------------------------------------------------------------------------------------------#import<Foundation/Foundation.h>@interfaceXYPoint:NSObject{intx;inty;}@propertyintx,y;-(void)setX:(int)xValandY:(int)yVal;@end21.8.2.2@class指令代碼清單8-4XYPoint.m實現(xiàn)文件---------------------------------------------------------------------------------------------------#import“XYPoint.h”@implementationXYPoint@synthesizex,y;-(void)setX:(int)xValandY:(int)yVal{x=xVal;y=yVal;}@end22.8.2.2@class指令代碼清單8-4Rectangle.h接口文件---------------------------------------------------------------------------------------------------#import<Foundation/Foundation.h>@classXYPoint;@interfaceRectangle:NSObject{intwidth;intheight;XYPoint*origin;}@propertyintwidth,height;-(XYPoint*)origin;-(void)setOrigin:(XYPoint*)pt;-(void)setWidth:(int)wandHeight:(int)h;-(int)area;-(int)perimeter;@end23.8.2.2@class指令代碼清單8-4Rectangle.m實現(xiàn)文件---------------------------------------------------------------------------------------------------#import“Rectangle.h”@implementationRectangle@synthesizewidth,height;-(void)setWidth:(int)wandHeight:(int)h{width=w;height=h;}–(void)setOrigin:(XYPoint*)pt{origin=pt;}–(int)area{returnwidth*height;}–(int)perimeter{return(width+height)*2;}–(XYPoint*)origin{returnorigin;}@end24.8.2.3具有對象的類代碼清單8-5---------------------------------------------------------------------------------------------------#import“Rectangle.h”#import“XYPoint.h”intmain(intargc,char*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];Rectangle*myRect=[[Rectanglealloc]init];XYPoint*myPoint=[[XYPointalloc]init];[myPointsetX:100andY:200];[myRectsetWidth:5andHeight:8];myRect.origin=myPoint;NSLog(@”O(jiān)riginat(%i,%i)”,myRect.origin.x,myRect.origin.y);[myPointsetX:50andY:50];NSLog(@”O(jiān)riginat(%i,%i)”,myRect.origin.x,myRect.origin.y);[myRectrelease];[myPointrelease];[pooldrain];return0;}代碼清單的輸出結果是什么?輸出:Originat(100,200)Originat(50,50)25.8.2.3具有對象的類將XYPointmyPoint從源程序中(100,200)改為(50,50)顯然也改變了矩形的原點。如果回顧setOrigin:方法的定義,也許就會明白:-(void)setOrigin:(XYPoint*)pt{origin=pt;}當使用一下表達式調用setOrigin方法時,myRect.origin=myPoint;myPoint的值作為參數(shù)傳遞給該方法。這個值指向存儲XYPoint對象的內存,如圖8-5所示。x100y200myPoint圖8-526.8.2.3具有對象的類存儲在myPoint(它是一個指向內存的指針)中的值被復制到在該方法中定義的本地變量中?,F(xiàn)在pt與myPoint都引用內存中相同的數(shù)據(jù)。如圖8-6所示:x100y200myPointpt圖8-627.8.2.3具有對象的類在方法中將Origin變量設置為pt時,pt中存儲的指針被復制到實例變量origin,如圖8-7所示:myPointptmyrectx100y200w5h8origin圖8-728.8.2.3具有對象的類因為myPoint和存儲在myRect中的origin變量引用內存中的同一區(qū)域,所以隨后將myPoint的值改為(50,50)時,矩形的原點也被更改。避免這一問題的辦法就是修改setOrigin:方法,以便分配自己的點并將原點設置為該點:-(void)setOrigin:(XYPoint*)pt{origin=[[XYPointalloc]init];[originsetX:pt.xandY:pt.y];}
這個方法首次分配并初始化一個新XYPoint。消息表達式[originsetX:pt.xandY:pt.y];將新分配的XYPoint設置為該方法參數(shù)的X,Y坐標。29.8.2.3具有對象的類setOrigin:方法的改變意味著每個rectangle實例現(xiàn)在都有它的originXYPoint實例。既然它負責為XYPoint分配內存,所以還應該負責釋放該內存。當一個類包含其他對象時,有時你希望擁有部分或全部對象。以矩形為例,它有自己的原點很合理。但是如何釋放origin占用的內存呢?釋放矩形內存,并不同時釋放為原點分配的內存。一種方式是在main中插入以下一行:[[myRectorigin]release];這樣可以釋放由原點方法返回的XYPoint對象。但是必須在Rectangle對象釋放自己的內存之前釋放XYPoint對象,因為在對象釋放內存后它包含的所有實例都是無效的。因此,正確的代碼順序應該如下所示:
[[myRectorigin]release];//Releasetheorigin’smemory[myRectrelease];//Releasetherectangle’smemory30.8.2.3具有對象的類使用修改后的方法,重新編輯和運行代碼清單8-5,將生成錯誤信息。這里的問題是由于修改后的方法中使用了XYPoint類的一些方法,所以現(xiàn)在編譯器需要的信息多于@class所能提供的。在這個例子中,返回并用import代替這個指令,如下:#import“XYPoint.h”代碼清單8-5的輸出結果為:Originat(100,200)Originat(100,200)31.第8章繼承通過繼承擴展:添加新的實例變量8.4重載方法8.3抽象類8.5一切從根類開始8.1通過繼承擴展——添加新方法8.2328.3重載方法前面一節(jié)提到過,不能通過繼承刪除或減少方法。但可以利用常在來更改繼承方法的定義。看著兩個類:ClassA和ClassB。假定要為ClassB編寫自己的initVar方法。你已經知道ClassB將繼承定義在ClassA中的initVar方法,但是是否可以新建一個同名的方法來替代繼承的方法呢?答案是可以的,只要定義一個同名的新方法即可。使用和父類相同的名稱定義的方法來代替或重載了繼承的定義。新方法必須具有相同的返回類型,并且參數(shù)的數(shù)目與重載的方法相同。代碼清單8-6展示了簡單的例子來說明這個概念。33.8.3重載方法代碼清單8-6-------------------------------------------------------------------------------------------------------//OverridingMethods#import<Foundation/Foundation.h>//ClassAdeclarationanddefinition@interfaceClassA:NSObject{intx;}-(void)initVar;@end@implementationClassA-(void)initVar{x=100;}@end34.8.3重載方法//ClassBdeclarationanddefinition@interfaceClassB:ClassA-(void)initVar;-(void)printVar;@end@implementationClassB-(void)initVar//addedmethod{x=200;}-(void)printVar{NSLog(@”x=%i”,x);}@end35.8.3重載方法intmain(intargc,char*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];ClassB*b=[[ClassBalloc]init];[binitVar];//usesoverridingmethodinB[bprintVar];//revealvalueofx;[brelease];[pooldrain];return0;}輸出:x=20036.8.3重載方法顯然消息[binitVar]導致使用定義在ClassB中的initVar方法,而不是使用CLassA中所定義的方法,前一示例也是如此。如圖所示。類NSObjectClassAClassB實例變量
xx方法
initVarinitVarprintVar37.8.3.1選擇哪個方法前面曾講到系統(tǒng)如何上溯類層析查找應用于對象的方法。如果在不同的類中有名稱相同的方法,則根據(jù)作為消息的接受者的類選擇正確的方法。代碼清單8-7使用與前面的ClassA和ClassB相同的類定義。代碼清單8-7-------------------------------------------------------------------------------------------------------#import<Foundation/Foundation.h>//insertdefinitionsforClassAandClassBhereintmain(intargc,char*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];ClassA*a=[[ClassAalloc]init];ClassB*b=[[ClassBalloc]init];[ainitVar]; //usesClassAmethod[aprintVar]; //revealvalueofx;[binitVar]; //useoverridingClassBmethod[bprintVar]; //revealvalueofx;[arelease];[brelease];[pooldrain];return0;}38.8.3.1選擇哪個方法編譯該程序時會得到以下警告消息:warning:‘ClassA’maynotrespondto‘-printVar’觀察ClassA的聲明://ClassAdeclarationanddefinition@interfaceClassA:NSObject{intx;}-(void)initVar;@end注意沒有聲明printVar方法。該方法聲明并定義在ClassB中。因此,盡管ClassB對象及其派生類可以通過繼承使用此方法,但ClassA對象卻不能使用此方法,這是由于此方法是沿著層次定義的。39.8.3.1選擇哪個方法回到例子,為ClassA添加一個printVar方法,以便顯示實例變量的值。//ClassAdeclarationanddefinition@interfaceClassA:NSObject{intx;}-(void)initVar;-(void)printVar;@end@implementationClassA-(void)initVar{x=100;}-(void)printVar{NSLog(@”x=%i”,x);}@endClassB的聲明與定義保持不變?,F(xiàn)在,再次嘗試編譯并運行該程序。x=100x=20040.8.3.2重載dealloc方法和關鍵字super既然知道如何重載方法后,那么返回代碼清單8-5,學習釋放origin所占內存的更好方法。setOrigin:方法現(xiàn)在為自己的XYPointorigin對象分配內存,并且你負責釋放它的內存。代碼清單8-6中使用的方法就是使用一下語句讓main釋放該內存:[[myRectorigin]release];所以不必擔心釋放所有單獨的類成員,可以重載繼承的dealloc方法(從NSObject繼承的)并在其中釋放origin的內存。注意:不重載release方法,而是重載dealloc方法。在后續(xù)章節(jié)中你將了解,release方法有時釋放對象使用的內存,有時卻不。只有在其他人引用某個對象時,release才釋放該對象所占用的內存。這通過調用該對象的dealloc方法來完成。實際上是由dealloc來釋放內存。41.8.3.2重載dealloc方法和關鍵字super如果覺得重載dealloc方法,必須確保不僅要釋放自己的實例變量所占用的內存,而且要釋放繼承的變量所占用的內存。
為此,需要利用關鍵字super,它引用消息接受者的父類??梢韵騭uper傳遞消息來執(zhí)行重載方法。這就是此關鍵字最常見的用途。所以,在方法內部使用消息表達式
[superrelease];時,調用定義在父類中的(或是父類繼承的)release方法。此方法是對消息的接受者調用的,換言之,是對self調用。因此,為Rectangle類重載dealloc方法的策略是,首先要釋放origin所占的內存,然后調用父類的dealloc方法完成這項任務。這就釋放了Rectangle對象自身所占的內存。下面是這個新方法:-(id)dealloc{if(origin)[originrelease];return[superdealloc];}42.8.3.2重載dealloc方法和關鍵字super定義dealloc方法沒有返回值。通過查看頭文件<NSObject.h>可以了解這點。在dealloc方法中,進行一項測試來查看釋放origin之前它釋放非零。很可能從未設置矩形的原點。這種情況下,它擁有默認值0。然后調用父類的dealloc方法,如果沒有重載,則Rectangle類將繼承此方法。應該指出,還可以如下更簡單的編寫這個dealloc方法:-(id)dealloc{[originrelease];return[superdealloc];}因為可以向nil對象發(fā)送消息。此外,要注意此時release原點,而不是dealloc它。如果沒有其他人使用原點,release就會在原點調用dealloc方法。有了這個新方法,現(xiàn)在只需要釋放分配了內存的矩形,而不需擔心其中包含的XYPoint對象。代碼清單8-5所示的兩條release消息:[myRectrelease];[myPointrelease];足以釋放在程序中分配內存的所有對象,包括setOrigin所創(chuàng)建的XYPoint對象。43.8.3.2重載dealloc方法和關鍵字super還有一個問題,如果在程序執(zhí)行期間將單個Rectangle對象的原點設置為不同的值,那么再分配和制定新的原點之前,必須釋放舊原點所占的內存。例如,在下面的代碼中:myRect.origin=startPoint;...myRect.origin=endPoint;...[startPointrelease];[endPointrelease];[myRectrelease];XYPointstartPoint的副本保存在myRect的成員origin中,它從未被釋放,這是因為它
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB 38144-2025眼面部防護應急噴淋和洗眼設備
- 2025年滁州明光市消防救援大隊招聘政府專職消防員15人考前自測高頻考點模擬試題(含答案詳解)
- 2025湖南瀘溪縣匯金產業(yè)投資集團有限公司招聘工作人員擬聘用人員考前自測高頻考點模擬試題及答案詳解參考
- 2025南昌動物園百花園管理所招聘3人模擬試卷及答案詳解(必刷)
- 2025廣東中山大學孫逸仙紀念醫(yī)院乳腺腫瘤中心科研助理招聘2人考前自測高頻考點模擬試題及答案詳解(各地真題)
- 2025湖南株洲市荷塘區(qū)招聘社區(qū)專職工作者筆試模擬試卷及答案詳解1套
- 2025未簽訂任何書面形式的合同離職
- 2025年中國激光增材制造設備行業(yè)市場分析及投資價值評估前景預測報告
- 2025年中國混凝土用引氣劑行業(yè)市場分析及投資價值評估前景預測報告
- 2025福建泉州市洛江區(qū)公辦學校專項招聘編制內新任教師9人(二)考前自測高頻考點模擬試題附答案詳解(黃金題型)
- 《中國心力衰竭診斷和治療指南2024》解讀
- 核電站電氣貫穿件介紹課件
- 《冠狀動脈性心臟病》課件
- eOps自動化運維平臺介紹
- 有機場效應晶體管
- 心臟病患者非心臟手術麻醉管理
- 網絡安全產品匯總介紹
- 高中日語學習宣講+課件
- 公路交通安全設施工高級工培訓內容
- GB/T 3141-1994工業(yè)液體潤滑劑ISO粘度分類
- 癌癥病人三階梯止痛治療原則標準課件
評論
0/150
提交評論