Interface in Structure benutzen
Verfasst: 21.04.2008 12:58
Hallo Leute,
ich weiß nicht, ob es einige hier sowieso schon so machen, aber hier ist mal
ein Beispiel, wie man sein Interface in die entsprechende Structure einbaut,
damit man auf Structure-Element gleichermaßen gut zugreifen kann wie auf
die Interface-Procedures.
ich weiß nicht, ob es einige hier sowieso schon so machen, aber hier ist mal
ein Beispiel, wie man sein Interface in die entsprechende Structure einbaut,
damit man auf Structure-Element gleichermaßen gut zugreifen kann wie auf
die Interface-Procedures.
Code: Alles auswählen
Interface Bruch_I
Set(zaehler.q, nenner.q) ;#False, wenn nenner = 0
Double.d()
Kehrwert() ;#False, wenn zaehler = 0
Kuerzen()
Str.s()
EndInterface
Structure Bruch
*VTable
I.Bruch_I
zaehler.q
nenner.q
EndStructure
Macro New(Struc)
Struc#_New()
EndMacro
Procedure Bruch_New()
Protected *bruch.Bruch
*bruch = AllocateMemory(SizeOf(Bruch))
If Not *bruch : ProcedureReturn #False : EndIf
*bruch\VTable = ?Bruch_VTable
*bruch\I = *bruch
*bruch\zaehler = 0
*bruch\nenner = 1
ProcedureReturn *bruch
EndProcedure
Procedure Bruch_Set(*bruch.Bruch, zaehler.q, nenner.q)
If nenner
*bruch\zaehler = zaehler
*bruch\nenner = nenner
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.d Bruch_Double(*bruch.Bruch)
ProcedureReturn *bruch\zaehler / *bruch\nenner
EndProcedure
Procedure Bruch_Kehrwert(*bruch.Bruch)
If *bruch\zaehler
Swap *bruch\zaehler, *bruch\nenner
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure Bruch_Kuerzen(*bruch.Bruch)
Protected k.l = 0, t.q, a.q = *bruch\zaehler, b.q = *bruch\nenner
If *bruch\zaehler = 0
*bruch\nenner = 1
ProcedureReturn
EndIf
If *bruch\nenner < 0
*bruch\zaehler = -*bruch\zaehler
*bruch\nenner = -*bruch\nenner
EndIf
a = *bruch\zaehler
If a < 0 : a = -a : EndIf
b = *bruch\nenner
While Not (a & 1 Or b & 1)
a >> 1
b >> 1
k + 1
Wend
If a & 1 : t = -b : Else : t = a : EndIf
While t
While Not t & 1
t >> 1
Wend
If t > 0 : a = t : t - b : Else : b = -t : t + a : EndIf
Wend
a << k
*bruch\zaehler / a
*bruch\nenner / a
EndProcedure
Procedure.s Bruch_Str(*bruch.Bruch)
ProcedureReturn StrQ(*bruch\zaehler) + "/" + StrQ(*bruch\nenner)
EndProcedure
DataSection
Bruch_VTable:
Data.l @Bruch_Set(), @Bruch_Double(), @Bruch_Kehrwert(), @Bruch_Kuerzen(), @Bruch_Str()
EndDataSection
*zahl.Bruch = new(Bruch)
*zahl\zaehler = 208
*zahl\nenner = 26
Debug *zahl\I\Str()
*zahl\I\Kuerzen()
Debug *zahl\I\Str()
*zahl\I\Kehrwert()
Debug *zahl\I\Str()
Debug *zahl\I\Double()