4. Abstrakte Klassen
"Eine abstrakte Klasse bezeichnet in der objektorientierten Programmierung eine spezielle Klasse, die mindestens eine, aber auch mehrere abstrakte Methoden enthalten (also Methoden ohne „Rumpf“ (Implementierung) nur mit der Signatur). Per Definition können abstrakte Klassen nicht instanziiert, d.h. keine Objekte von ihnen erzeugt werden."
Auszug aus dem Wikipedia
Dies machen wir uns heute in diesem Tutorial zu Gebrauch.
Die abstrakte Klasse nennen wir xObject.
Eine Liste sorgt dafür den Überblick bzw die Pointer nicht zu verlieren und somit den Zugriff zu behalten.
Für die müden Entwickler gibts das Tutorial hier zum Download
Die Abstrakte Klasse
Class xObject Abstract
Global list:List<xObject>
Field x:Float
Field y:Float
Public
Function Init:Void() Abstract
Function GetLastObject:xObject() Abstract
Method OnRender:Void() Abstract
Method OnUpdate:Void() Abstract
Method Destroy:Void() Abstract
Method New()
If( list = Null) Then list = New List<xObject>
list.AddLast(Self)
End
Method Reset()
If( list <> Null)
list.Clear()
End
End
Function RenderAll:Void()
For Local obj := Eachin list
If (Not obj.IsDestroyed()) Then obj.OnRender()
Next
End
Function UpdateAll:Void()
For Local obj := Eachin list
If (Not obj.IsDestroyed()) Then obj.OnUpdate()
Next
End
Method IsDestroyed:Bool()
Return False
End
End
Da wir eine abstrakte Klasse nicht direkt instanzieren können, müssen wir über
Class KlasseX extends xObject
unsere Klasse erweitern.
Wir erstellen also eine neue Klasse, zB.:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Klasse Ball
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Class Ball extends xObject
Field Position_X:Float
Field Position_Y:Float
Field DrawPosition_X:Float
Field DrawPosition_Y:Float
Field Radius:Float
Field ColorR:Float
Field ColorG:Float
Field ColorB:Float
Field Visible:Bool=True
'Nur für unsere OnUpdate Rotation
Field Winkel:Float=0
Field OrbitRadius:Float
Method Create:Ball(Position_X:Float=100,Position_Y:Float=100,Radius:Float=20,
UmdrehungsRadius:Float=20,ColorR:Int=0,ColorG:Int=0,ColorB:Int=255)
Self.Position_X = Position_X
Self.Position_Y = Position_Y
Self.DrawPosition_X = Position_X
Self.DrawPosition_Y = Position_Y
Self.Radius = Radius
Self.ColorR = ColorR
Self.ColorG = ColorG
Self.ColorB = ColorB
Self.OrbitRadius = UmdrehungsRadius
Return Self
End
Method Show:Void()
Self.Visible = True
End
Method Hide:Void()
Self.Visible = False
End
Method OnRender:Void()
'Hier ist der OnRender Einsprung welcher über xObject in die Hauptklasse eingebunden wird
SetColor(ColorR,ColorG,ColorB)
DrawCircle(DrawPosition_X,DrawPosition_Y,Radius)
End
Method OnUpdate:Void()
'Hier ist der OnUpdate Einsprung welcher über xObject in die Hauptklasse eingebunden wird
Winkel += 2
If(Winkel > 360)
Winkel = 0
End
Self.DrawPosition_X = Self.Position_X + OrbitRadius*Sin(Winkel)
Self.DrawPosition_Y = Self.Position_Y + OrbitRadius*Cos(Winkel)
End
End
Und unsere Hauptklasse welche in die Mojo App eingebunden wird:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Unser App
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Class MyApp extends App
Field Player:= new Ball
Method OnCreate()
'Ohne SetUpdateRate geht nix
SetUpdateRate(25)
Seed = Millisecs()
Player.Create(DeviceWidth/2,DeviceHeight/2,50,255,0,0)
'.. und per Schleife
For Local balls:Int = 0 to 20
Local bl:= new Ball
bl.Create(Rnd(0,DeviceWidth),Rnd(0,DeviceHeight),Rnd(5,20),Rnd(10,100),Rnd(0,255),Rnd(0,255),Rnd(0,255))
Next
End
Method OnLoading()
End
Method OnUpdate()
xObject.UpdateAll()
End
Method OnRender()
Cls
xObject.RenderAll()
End
'Custom Stuff
End
Function Main()
New MyApp
End
Das schöne ist nun, Ihr könnt soviel Objekte verwalten wie ihr möchtet und könnt jeweils direkt innerhalb eurer Klasse in die OnRender, OnUpdate & Co reinschreiben.
Alles was ihr machen müsst ist in die OnRender() eurer Hauptklasse ein
xObject.RenderAll()
und in die OnUpdate() ein
xObject.UpdateAll()
Über die Methoden Show und Hide könnt ihr die Objekte anzeigen.
Ein xObject.Reset leert die Liste und somit die Objekte
Fragen und Anregungen sind herzlich willkommen und können im Forum optimal diskutiert werden :)
Ein schönes Beispiel in der Anwendung ist das Spiel IMPACT welches Ihr auf Monkeycoder.co.nz von Jochen Heizmann OpenSource findet.
Weiterhin viel Spass und bis bald,
Xzess
