Methode eines unbekannten Objektes ansprechen [erledigt]

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

d-bug

Betreff: Methode eines unbekannten Objektes ansprechen [erledigt]

BeitragDo, Dez 15, 2005 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Erklärung zum Code:
Es gibt ein globales Haupttype, in dem ein Object-Array deklariert ist. In diesem Array werden unbekannte Types gespeichert. Das Haupttype hat eine Update-Methode, die jedes Object in dem Array abrufen soll um dessen eigene Update-Methode aufzurufen. Ich hoffe soweit konntet ihr mir folgen.

Problem:
Das Problem dabei ist, das BM nicht bekannt zu sein scheint, welches Type sich gerade in dem Array befindet, also ob es nun tplugin1, tplugin2 usw. ist. Wie sage ich BM nun welches Type das richtige ist ?

Code: [AUSKLAPPEN]
Global main:tmain = New tmain

Type tmain

   Field plugin:Object[1]
   Field pluginco:Int=0

   Method Update()
      For Local plug:Object = EachIn plugin
         plug.Update()   '<------- funktioniert so nicht
      Next
   End Method

End Type

Type tplugin1
   Field main:tmain
   
   Function Create:tplugin1 ()
      Local plug:tplugin1 = New tplugin1
      main.pluginco:+1
      main.plugin = main.plugin[..(main.pluginco+1)]
      main.plugin[main.pluginco] = plug
      Return plug
   End Function

   Method Update()
      '... Mach was tolles
   End Method
End Type

Type tplugin2
   '... usw ...
End Type

Type tplugin3
   '... usw ...
End Type


Danke für eure Aufmerksamkeit Wink

greetz
  • Zuletzt bearbeitet von d-bug am Fr, Dez 16, 2005 11:07, insgesamt 2-mal bearbeitet

Markus2

BeitragFr, Dez 16, 2005 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde sagen so

Method Update()
Local x:tplugin1
For x = EachIn plugin
x.Update()
Next
End Method

d-bug

BeitragFr, Dez 16, 2005 0:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann muss ich aber in dem Main-Type schon wissen, das das Object tplugin1 ist. Genau das möchte ich aber verhindern. tplugin1 bis 3 gibt es ja nicht immer.

Markus2

BeitragFr, Dez 16, 2005 0:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Geht das nicht mit diesen Listen?
x:TList=CreateList() oder so
ich meine da kann man alles rein werfen .

Jolinah

BeitragFr, Dez 16, 2005 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest nen Basetype für die Plugins machen. Dieser hat die Update Methode. Alle Plugins erben von dem diese Methode. Dann machst du ne Liste mit diesem Basetyp statt mit Objects.

Code: [AUSKLAPPEN]

Type BasePlugin Abstract
  Method Update() Abstract
End Type

Type plugin1 extends BasePlugin
  Method Update()
    Print "1"
  End Method
End Type

Type plugin2 extends BasePlugin
  Method Update()
    Print "2"
  End Method
End Type

Local arr:BasePlugin[] = new BasePlugin[20]
'oder
Local list:TList = new List

'dann
For local plugin:BasePlugin = eachin list 'bzw. arr
  plugin.Update()
Next


Deine Variante funktioniert nicht, weil Object keine Update Methode hat.

Alle Typen die von BasePlugin erben können in ein BasePlugin zurückkonvertiert werden. Das ist dann sowas ähnliches wie ein Object (ein Platzhalter für all deine anderen Types die davon ableiten). So weiss BMax alle sind vom Type BasePlugin, welcher die Update-Methode besitzt.

Es wird aber trotzdem erkannt dass das Objekt eigentlich vom Type plugin1 bzw. plugin2 ist. Beim Aufruf der Update-Methode wird deshalb die überschriebene Methode von plugin1 bzw. plugin2 benutzt statt die von BasePlugin.

d-bug

BeitragFr, Dez 16, 2005 11:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Jolinah, etwas sehr ähnliches hat Suco-X mir gestern noch im chat verraten.

Code: [AUSKLAPPEN]
Strict

Type THAUU
    Method MachWas() Abstract
   
    Method Out()
        MachWas()
    End Method
End Type

Type Plugin1 Extends THAUU
   
    Method MachWas()
   
        Print "PLUGIN 1"
    End Method

End Type

Type Plugin2 Extends THAUU

    Method MachWas()
        Print "ICH KOCHE GERNE"
    End Method

End Type

Local Temp:THauu  = New Plugin1
Local Temp2:THauu = New PLugin2

Temp.Out()
Temp2.Out()


Das funktioniert hervorragend, also nochmal ein großes DANKE an Suco-X, Jolinah und alle die mir helfen wollten.

regaa

BeitragFr, Dez 16, 2005 12:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Netter Trick bzw. Technik. Bin ich noch nicht drauf gekommen. Verdamt aber auch, Vererbung macht ja echt nen Sinn Laughing . Habe z.B. Methodenweise 10 verschiedene Typen die alle fast die selbe Methode aufrufen, und das hätte man sich sparen können....
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net
 

Ava

Gast

BeitragFr, Dez 16, 2005 13:08
Antworten mit Zitat
Ich verstehe jetzt nur nicht so recht, warum Du die Methode noch einmal
in eine andere Methode verpackt hast? Ist das ein persönlicher Spleen
oder hat das einen Sinn? - denn funktionieren tut es so ja auch:


Code: [AUSKLAPPEN]
Strict


Type THAUU

    Method MachWas()
    End Method

End Type


Type Plugin1 Extends THAUU
   
    Method MachWas()   
        Print "PLUGIN 1"
    End Method

End Type


Type Plugin2 Extends THAUU

    Method MachWas()
        Print "ICH KOCHE GERNE"
    End Method

End Type


Local Temp:THauu  = New Plugin1
Local Temp2:THauu = New PLugin2


Temp.machWas()
Temp2.machWas()

Jolinah

BeitragFr, Dez 16, 2005 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau darum gefällt mir OOP, darum gehts eigentlich auch in der OOP. Types allein ohne die Vererbung und Polymorphismus bringen noch nicht wirklich viel Wink

Bei nem GUI ist sowas z.B. sehr praktisch. Alle Typen stammen dann von nem BaseControl ab, welches grundlegende Methoden und Events (Callbacks) bereitstellt. Bei all den anderen Types müssen diese dann nicht immer und immer wieder implementiert werden. Und um alle Controls durchzugehen kann man einfach eine Liste mit BaseControls machen. Diese lassen sich alle gleich behandeln. Will man etwas an allen Controls ändern so baut man es einfach im BaseControl-Type ein.

Dann lassen sich weitere Zwischenebenen erstellen. Angenommen es gibt mehrere Controls die sich anders als das BaseControl verhalten, aber trotzdem alle nach dem gleichen Prinzip funktionieren, so baut man einfach nen Type ein der von BaseControl erbt. Und alle Controls die nun das gleiche machen erben von diesem neuen Type. Trotzdem sind alle Controls gleichzeitig immer noch BaseControls Smile

Code: [AUSKLAPPEN]

Type Control
  Field x:Short, y:Short
  Field text:String
End Type

Type ScrollControl extends Control
  Field scroll_x:Short, scroll_y:Short
End Type

Type ScrollTextbox extends ScrollControl
  'spezielles für die Textbox
End Type

Type ScrollPanel extends ScrollControl
  'spezielles für das Panel
End Type

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group