Methode eines unbekannten Objektes ansprechen [erledigt]
Übersicht

![]() |
d-bugBetreff: Methode eines unbekannten Objektes ansprechen [erledigt] |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() greetz |
||
- Zuletzt bearbeitet von d-bug am Fr, Dez 16, 2005 11:07, insgesamt 2-mal bearbeitet
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde sagen so
Method Update() Local x:tplugin1 For x = EachIn plugin x.Update() Next End Method |
||
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Geht das nicht mit diesen Listen?
x:TList=CreateList() oder so ich meine da kann man alles rein werfen . |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Netter Trick bzw. Technik. Bin ich noch nicht drauf gekommen. Verdamt aber auch, Vererbung macht ja echt nen Sinn ![]() |
||
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net |
AvaGast |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group