4. Abstrakte Klassen

Veröffentlicht am Mittwoch, 22 Juni 2011

 

"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

 

 

 

 

Buy cheap web hosting service where fatcow web hosting review will give you advices and please read bluehost review for more hosting information.
Free Joomla Templates designed by Web Hosting Top