;准备好函数原型
Shape_Init PROTO :DWORD
Shap_destructorPto TYPEDEF PROTO :DWORD
Shap_getAreaPto TYPEDEF PROTO :DWORD
Shap_setColorPto TYPEDEF PROTO :DWORD, :DWORD
;实际上就是STRUC的定义
CLASS Shape, Shap
CMETHOD destructor
CMETHOD getArea
CMETHOD setColor
Color dd ?
Shape ENDS
.data
;初始化
BEGIN_INIT
dd offset Shap_destructor_Funct
dd offset Shap_getArea_Funct
dd offset Shap_setColor_Funct
dd NULL
END_INIT
.code
Shape_Init PROC uses edi esi lpTHIS:DWORD
;实际调用初始化
SET_CLASS Shape
;把edi assmue 为Shape类型
SetObject edi, Shape
;额外定义的DPrint宏,不用细究
DPrint "Shape Created (Code in Shape.asm)"
;取消assmue
ReleaseObject edi
ret
Shape_Init ENDP
Shap_destructor_Funct PROC uses edi lpTHIS:DWORD
SetObject edi, Shape
DPrint "Shape Destroyed (Code in Shape.asm)"
ReleaseObject edi
ret
Shap_destructor_Funct ENDP
Shap_setColor_Funct PROC uses edi lpTHIS:DWORD, DATA:DWORD
SetObject edi, Shape
mov eax, DATA
mov [edi].Color, eax
DPrint "Shape Color Set!! (Code in Shape.asm)"
ReleaseObject edi
ret
Shap_setColor_Funct ENDP
Shap_getArea_Funct PROC uses edi lpTHIS:DWORD
SetObject edi, Shape
DPrint " "
DPrint " SuperClassing!!!!! This allows code re-use if you use this method!!"
DPrint " Shape's getArea Method! (Code in Shape.asm)"
mov eax, [edi].Color
DPrint " Called from Shape.getArea, (Code in Shape.asm)"
DPrintValH eax, " This objects color val is"
DPrint " "
ReleaseObject edi
ret
Shap_getArea_Funct ENDP
继承这个类
include Shape.asm ; Inherited class info file
Circle_Init PROTO :DWORD
Circ_destructorPto TYPEDEF PROTO :DWORD
Circ_setRadiusPto TYPEDEF PROTO :DWORD, :DWORD
Circ_getAreaPto TYPEDEF PROTO :DWORD
CLASS Circle, Circ
;继承原有的数据和函数
Shape <> ; Inherited Class
CMETHOD setRadius
Radius dd ?
Circle ENDS
.data
BEGIN_INIT
dd offset Circ_destructor_Funct
dd offset Circ_setRadius_Funct
dd NULL
END_INIT
.code
Circle_Init PROC uses edi esi lpTHIS:DWORD
;初始化并实现继承
SET_CLASS Circle INHERITS Shape
SetObject edi, Circle
;相当于构造函数重置vptr
OVERRIDE getArea, CirleAreaProc
DPrint "Circle Created (Code in Circle.asm)"
ReleaseObject edi
ret
Circle_Init ENDP
Circ_destructor_Funct PROC uses edi lpTHIS:DWORD
SetObject edi, Circle
DPrint "Circle Destroyed (Code in Circle.asm)"
;实现了基类函数的调用
SUPER destructor
ReleaseObject edi
ret
Circ_destructor_Funct ENDP
Circ_setRadius_Funct PROC uses edi lpTHIS:DWORD, DATA:DWORD
SetObject edi, Circle
mov eax, DATA
mov [edi].Radius, eax
DPrint "Circle Radius Set (Code in Circle.asm)"
ReleaseObject edi
ret
Circ_setRadius_Funct ENDP
CirleAreaProc PROC uses edi lpTHIS:DWORD
LOCAL TEMP
SetObject edi, Circle
SUPER getArea
mov eax, [edi].Radius
mov TEMP, eax
finit
fild TEMP
fimul TEMP
fldpi
fmul
fistp TEMP
mov eax, TEMP
DPrint "Circle Area (integer Rounded) (Code in Circle.asm)"
ReleaseObject edi
ret
CirleAreaProc ENDP
根据类来生成对象,并使用
DEBUGC equ 1
.586
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib
include Dmacros.inc
include Objects.inc
include Circle.asm
.data
.data?
hCircle dd ?
.code
start:
; Recuse all inherited constructors.. and do all inits
DPrint " "
DPrint " >>> main.asm <<< [ mov hCircle, $NEW( Circle ) ]"
mov hCircle, $NEW( Circle )
DPrint " "
DPrint " >>> main.asm <<< [ METHOD hCircle, Circle, setColor, 7 ]"
METHOD hCircle, Circle, setColor, 7
DPrint " "
DPrint " >>> main.asm <<< [ METHOD hCircle, Circle, setRadius, 2 ]"
METHOD hCircle, Circle, setRadius, 2
DPrint " "
DPrint " ------------ TEST POLYMORPHIC METHOD hCircle.getArea ------------- "
DPrint " "
DPrint " >>> main.asm <<< [ DPrintValD $EAX( hCircle, Circle, getArea ) , 'Area of hCircle' ]"
DPrintValD $EAX( hCircle, Circle, getArea ) , "Area of hCircle"
DPrint " "
DPrint " ------------ TEST POLYMORPHIC METHOD hCircle.getArea ------------- "
DPrint " "
DPrint " >>> main.asm <<< [ DPrintValD $EAX( hCircle, Shape, getArea ) , 'Area of hCircle' ]"
DPrint " Typing calling this Ojbect Instance as a SHAPE type only! This is the true value"
DPrint " of Polymorphism. We dont need to know its a Circle object in order to get the"
DPrint " proper area of this instance object, that is inherited from Shape."
DPrint " "
DPrintValD $EAX( hCircle, Shape, getArea ) , "Area of hCircle"
DPrint " "
DPrint " "
DPrint " >>> main.asm <<< [ DESTROY hCircle ]"
DESTROY hCircle
DPrint " "
DPrint " "
DPrint " NOTE: superclassing here, as each destructor call's the SUPER destructor"
DPrint " To properly clean up after each class. To see SUPER classing in"
DPrint " in the Polymorphic getArea Function. Uncomment the SUPER code in"
DPrint " CircleAreaProc, and re-compile"
call ExitProcess
end start
Shape_Init PROC uses edi esi lpTHIS:DWORD
SET_CLASS Shape
SetObject edi, Shape
DPrint "Shape Created (Code in Shape.asm)"
ReleaseObject edi
ret
Shape_Init ENDP
push esi
push edi
cld
mov esi, offset @InitValLabel
mov edi, lpTHIS
mov ecx, @InitValSizeLabel
shr ecx, 2
rep movsd
mov ecx, @InitValSizeLabel
and ecx, 3
rep movsb
pop edi
pop esi
Circ_destructor_Funct PROC uses edi lpTHIS:DWORD
SetObject edi, Circle
DPrint "Circle Destroyed (Code in Circle.asm)"
SUPER destructor
ReleaseObject edi
ret
Circ_destructor_Funct ENDP