[Monkey] Field in der Mutter-Class ändern. Wie geht das?

Übersicht Andere Programmiersprachen Beginners-Corner

Neue Antwort erstellen

Midimaster

Betreff: Field in der Mutter-Class ändern. Wie geht das?

BeitragSo, März 13, 2011 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe gerade folgendes Problem. Ich möchte um Performance zu sparen, den Bildschirmaufbau nicht 60x in der Sekunde durchführen, sondern nur dann, wenn sich eines der Bildelemente wirklich verändert hat. Dazu habe ich mit eine Variable MalenNoetig% in der Haupt-Klasse ausgedacht und die soll nun von den Bildelementen der Unterklassen gesetzt werden, wenn sich dort etwas getan hat.

symbolische Code:
BlitzBasic: [AUSKLAPPEN]
Class A Extends App

Field MalenNoetig%

Method AA ()
B.BC()
End

Method AB ()
If MalenNoetig=1 Then
' etwas malen
MalenNoetig=0
EndIf
End
End


Class B
Function BC()
' Class A anweisen, zu malen:
Super.MalenNoetig=1
End
End


Mein Problem nun: Wie spreche ich nun eine Variable der Mutterklasse von einer Unterklasse aus an? "Super" führt in MONKEY zu einem Fehler.

Hier der Vollständigkeit halber ein Programm dazu:
BlitzMax: [AUSKLAPPEN]

Import mojo

Class ErstesSpiel Extends App

Field MalenNoetig%

Method OnCreate% ()
New BildElemente
BildElemente.CreateAlle()
SetUpdateRate 60
Return 0
End

Method OnUpdate% ()
Local Was$ = BildElemente.CheckAlle()
If Was="A" Then
' was halt zu tun ist
EndIf
Return 0
End

Method OnRender% ()
If MalenNoetig=1 Then
Cls
BildElemente.DrawAlle()
MalenNoetig=0
EndIf
Return 0
End
End

Function Main% ()
New ErstesSpiel
Return 0
End



Class BildElemente
Function CreateAlle%()
Return 0
End

Function CheckAlle$()
Local Arbeit$
'If...Then Arbeit="A"
'Super.MalenNoetig=1
Return Arbeit
End

Function DrawAlle%()
'DrawRect ....
End

End

Holzchopf

Meisterpacker

BeitragSo, März 13, 2011 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf die Gefahr hin, mich als absoluter Monkey-Noob zu outen (bin ich aber eigentlich auch): Class B hat A ja nur dann als "Mutter"-Klasse, wenn B von A erbt - diese also extended (man verzeihe mein Denglisch). Ich weiss nicht, ob Monkey diese Möglichkeit bietet und, ob es in dein Problem passt, aber du könntest ja alternativ MalenNoetig% als global in A deklarieren und in B einfach A.MalenNoetig setzen.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Noobody

BeitragSo, März 13, 2011 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du von einer Klasse erbst, erhältst du auf die Member der Basisklasse automatisch Zugriff, als ob du sie in deiner erbenden Klasse definiert hättest. Um aber auf die Felder einer Basisklasse zugreifen zu können, musst du dafür sinnigerweise auch von einer Klasse erben, was "BildElemente" bei dir aber nicht tut.

In diesem Fall ist Vererbung allerdings nicht unbedingt sinnvoll. Ich würde eher vorschlagen, die "MalenNoetig"-Variable in "ErstesSpiel" global zu machen, so dass du von allen zeichnenden Klassen Zugriff darauf hast.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Midimaster

BeitragSo, März 13, 2011 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, danke ich habs gleich ausprobiert und es funktioniert auch schon.

Meine Klasse ErstesSpiel ist ja noch mal Tochter der App-Klasse in Monkey. Welche weiteren Auswirkungen hat nun das Umändern von MalenNoetig% von Field auf Global? Reicht Global auch in die Main() und in andere Instanzen des Spiels?

@Noobody:
"erben" wäre also, wenn ich die Klasse Bildelemente mit Extends ErstesSpiel erweitern würde.
Warum wäre dies "nicht unbedingt sinnvoll" und welche neg. Auswirkungen hat das dann auf das Spiel?

Da ja später tatsächlich auch andere Spiel-Unterklassen solch einen MalenNoetig%=1 erzwingen können sollen, ist mir die Variante mit dem GLOBAL auch sehr schön.


Danke an euch beide

Shinkiro1

ehemals "Espada"

BeitragSo, März 13, 2011 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Globale Variablen einer Klasse können wie folgt angesprochen werden (und das von überall aus):
BlitzMax: [AUSKLAPPEN]
ClassName.globaleVariable


PS: Geht in Bmax genauso Very Happy

Noobody

BeitragSo, März 13, 2011 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
@Midimaster: Wenn du in einem Type einen Member Global machst, ist er von überall aus erreichbar - man muss allerdings, wie von Shinkiro gezeigt, den Klassennamen vornedran stellen.

Was die Vererbungsfrage angeht: Faustregel ist, dass man sich immer fragen sollte: "Geht es auch ohne Vererbung?". Das Problem ist, dass Vererbung eine sehr starke Bindung ist, da man ausnahmslos alle Member und Methoden der Basisklasse erbt. Ändert man also die Struktur in der Basisklasse, sind alle erbenden Klassen betroffen und benötigen möglicherweise Codeänderungen.

Um zu entscheiden, ob bei einer Klasse Vererbung angebracht ist, hilft mir immer die Eselsbrücke "[Erbende Klasse] ist ein [Basisklasse]". Z.B: Ein Mesh ist ein Entity, daher erbt Mesh von Entity. ErstesSpiel ist ein Programm, daher erbt es von Mojo.App (lication). Bildelemente aber sind kein Spiel, daher sollte man Vererbung hier vermeiden und den Zugriff eher über Methoden und Variablen lösen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group