OOP Frage

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Freeman

Betreff: OOP Frage

BeitragSo, Jun 11, 2006 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Nachdem ich das Tutorial von Jolinah gelesen habe , habe ich etwas herumgespielt und bin auf eine Frage gestoßen die nicht beantwortet wurde.
Ich lasse mal den Code sprechen

Code: [AUSKLAPPEN]

Strict

Type Bands
Field Name:String
Field liste:Tlist=Createlist()

Method add:Bands(Band:String)
       Local e:Bands = New Bands
       e.Name=Band
       Listaddlast(liste,e)
End Method
End Type

Type dummy extends Bands

Method nennen()
      For local a:Bands = eachin liste
           print "Band :"+a.Name
      Next
End Method
End Type

Local all:Bands = New Bands
Local b:dummy = New dummy

all.add("Metallica")
all.add("KoRn")
all.add("Shakira")
b.nennen()


rem
For local a:Bands = eachin all.liste
          print "Band :"+a.Name
Next
end rem


So, wie man sieht habe ich 2 Klassen erstellt. In einer Klasse ( Bands) wird in einer Liste die Namen der Bands gespeichert. Ich möchte jetzt diese Liste
aus einer anderen Klasse aufrufen und auslesen. Wie man an meinem Beispiel sieht ist der Versuch kläglich gescheitert. Wie macht man es richtig?

Fr3eMaN

Artemis

BeitragSo, Jun 11, 2006 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
@Freeman

Die Liste, wo die drei Bands hinzugehören, gehört all.
Jetzt kannst du nicht mit b darauf zugreifen, weil b eine andere Variable ist.

Oder anders:
all bist du. Du hast 100 € in einem Safe, wo nur du rankommst.
b ist dein Kind (wegen Extends). Dein Kind kann aber nicht auf den Safe zugreifen, weil es eine andere Person ist.

rema

BeitragSo, Jun 11, 2006 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst die "liste" nicht als Feld anlegen, sondern als globale Variabel anlegen...

Code: [AUSKLAPPEN]

Strict

Type Bands

   Global liste:TList=CreateList()

   Field Name:String
   
   Method add:Bands(Band:String)
         Local e:Bands = New Bands
         e.Name=Band
         ListAddLast(liste,e)
   End Method

End Type

Type dummy Extends Bands

   Function nennen()
         For Local a:Bands = EachIn liste
              Print "Band :"+a.Name
         Next
   End Function

End Type

Local all:Bands = New Bands
Local b:dummy = New dummy

all.add("Metallica")
all.add("KoRn")
all.add("Shakira")

b.nennen()

Freeman

BeitragSo, Jun 11, 2006 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@Rema, das weis ich das man es so machen könnte,allerdings wollte ich die liste in der Klasse haben.
Nagut wenn es nicht geht (habe ich mir schon gedacht Crying or Very sad ) dann werd ich die Liste wohl global machen müssen. Danke

Fr3eMaN

Jolinah

BeitragSo, Jun 11, 2006 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Das geht nicht weil es 2 Unterschiedliche Objekte sind, und Eigenschaften sind ja an ein Objekt gebunden. Dazu gibt es ja gerade Global. Du darfst das aber nicht mit einem normalen Global verwechseln. Das Feld ist nur innerhalb des Types global, nicht über die ganze Applikation. Und Global darf in einem Type auch ohne Zweifel verwendet werden, das hat nichts gemeinsam mit der Aussage, dass man möglichst wenig Globals benutzen soll und stattdessen Funktionsparameter verwenden soll Wink

PS: Die Liste ist mit Global in der Klasse, ausser du schreibst es ausserhalb der Klasse Wink

rema

BeitragSo, Jun 11, 2006 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Freeman hat Folgendes geschrieben:
@Rema, das weis ich das man es so machen könnte,allerdings wollte ich die liste in der Klasse haben.
Nagut wenn es nicht geht (habe ich mir schon gedacht Crying or Very sad ) dann werd ich die Liste wohl global machen müssen. Danke

Fr3eMaN


Die Liste ist doch in der Klasse bzw im Type! Es kommt darauf an was du genau machen willst. Denn wie du schon sagtest, der Quellcode spricht für sich...
 

Dreamora

BeitragSo, Jun 11, 2006 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Da hier wohl trotz allem eine sehr tiefgreifende Fehlannahme besteht beim Schreiber:

Ein Field in einem Type existiert für jedes neu erzeugte Objekt dieses Types neu! Diese Liste kann dann zb nicht alle Objekte dieses Types speichern.
Das geht nur über "statische Felder", also Felder die nur 1x existieren für alle Objekte dieses Types. Ein solches statische Feld erzeugt man, indem man es anstatt mit field .... mit global ... erzeugt.
Das hat nichts mit dem sonst verwendeten global zu tun.

Mark, der macher von BM hat sich da leider zu sehr auf "gemeinsamkeiten" eingelassen die zu sehr kritischen Fehlannahmen führen wie in diesem Falle. Static wäre definitiv das bessere Keyword gesehen. In types als auch bei der verwendung in Funktionen/Methoden ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

rema

BeitragSo, Jun 11, 2006 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist schon klar, das Global nicht gleich Global ist. Für mich ist halt immer noch die Frage offen was Freeman eigentlich machen will, den das umgeschriebene Beispiel von mir stellt doch klar wie Global innerhalb von einem Type zu nutzen ist, wie zbsp das Sammeln von Instanzen einer Klasse bzw Types...

Farbfinsternis

BeitragMo, Jun 12, 2006 8:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Was Freeman da machen will ist klar. Er will eine Linked List haben in der er Werte hält welche über eine zweite Klasse verwaltet werden. Leider ist das was er da versucht totaler nonens. Ein Extend ist da völlig fehl am Platz.

Code: [AUSKLAPPEN]

SuperStrict

' Klasse zum halten der Daten
Type TBands
   Global _list:TList
   
   Field name:String
   
   Function Add:TBands(name:String)
      Local band:TBands = New TBands
      
      If band._list = Null Then band._list = New TList
      band._list.AddLast(band)
      
      band.name = name
      
      Return band
   End Function
End Type

' Klasse zum verwalten der Daten
Type TAdminBands
   Field bands:TBands
   
   Method Add(name:String)
      bands = TBands.Add(name)
   End Method
   
   Method List()
      For bands:TBands = EachIn bands._list
         DebugLog bands.name
      Next
   End Method
End Type

Local myBands:TAdminBands = New TAdminBands

myBands.Add("Eisregen")
myBands.Add("Onkelz")
myBands.Add("Rammstein")

myBands.List()

End


So funktioniert das was Freeman da eigentlich machen wollte.
Farbfinsternis.tv

Freeman

BeitragMo, Jun 12, 2006 9:36
Antworten mit Zitat
Benutzer-Profile anzeigen
kein komentar, langsam wirds hier echt peinlich was man sich da so zusammenspinnt. Klar gibt es mehrere möglichkeiten um das problem zu lösen, trotzdem wollte ich von einer anderen Klasse auf eine Liste zugreifen und sie dort auslesen (nicht noch eine extraprozedur für das hinzufügen bauen). Das habe ich mitlerweile so gemacht das ich einfach di list als global gemacht habe. Shluss aus Ende
@Farbfinsternis dein Code funktioniert nicht, das heißt es kommt zu keiner Ausgabe der bandnamen. so viel dazu.

@Mods bitte Thread schließen, da das Problem schon im 3. Post gelöst wurde.

Fr3eMaN

BladeRunner

Moderator

BeitragMo, Jun 12, 2006 10:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir funzt Farbfinsternis' Code ohne Probleme.
Aber wie gewünscht:

~GESCHLOSSEN~
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

D2006

Administrator

BeitragMo, Jun 12, 2006 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
~WIEDERERÖFFNET~
Wir schließen keine Themen, nur weil der Threadstarter das so will. Gerade das Thema OOP wird auch zukünftig noch viele Fragen hervorbringen, welche dann eventuell in diesem Thread durch eine weitere Diskussion geklärt werden könnte.

Ich hielt Rücksprache mit BladeRunner und durch den begründeten Einwand remas wird er wiedereröffnet.

Ich bitte um Verzeihung für die Unanehmlichkeiten.

Mit freundlichen Grüßen
D2006
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Suco-X

BeitragMo, Jun 12, 2006 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Ich wollte noch anmerken, dass sich die Lösung mit Globals auch gut meiden lässt, indem man sich seinen Code besser aufteilt und Verwaltungs-Types erstellt.
Mit Globals besteht halt immer die Gefahr, dass man sich Sprichwörtlich verläuft.

Beispiel:

Code: [AUSKLAPPEN]

Strict


Type TPublisher
   Field Bands:TList
   
   Method New()
      Bands = New TList
   End Method

   Method Add:TBand(Name:String)
      Return New TBand.Create(Bands, Name)
   End Method

   Method NenneBands()
      For Local Band:TBand = EachIn Bands
         Print "Band :" + Band.Name
      Next
   End Method
   
End Type


Type TBand
   Field Name:String
   
   Method Create:TBand(List:TList , Name:String)
      self.Name = Name
      List.AddLast(Self)
      Return Self
   End Method
   
End Type


Local SucoX:TPublisher = New TPublisher
SucoX.Add("Metallica")
SucoX.Add("KoRn")
SucoX.Add("Shakira")
SucoX.NenneBands()


So kann man Globals immer umgehen.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Jolinah

BeitragMo, Jun 12, 2006 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist auch eine gute Lösung Wink

Wie Dreamora aber schon sagte wäre die Bezeichnung Static auch in BlitzMax eindeutig besser für statische Felder. Mit Globals hat das ja eigentlich nichts zu tun. Ich persönlich sehe nicht ein, wieso man statische Felder meiden sollte, schliesslich benutzt man statische Methoden (Function) ja auch. Die statischen Felder gehören imho einfach zur OOP dazu, wie die anderen Sachen auch.

Suco-X

BeitragMo, Jun 12, 2006 23:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Zitat:

Wie Dreamora aber schon sagte wäre die Bezeichnung Static auch in BlitzMax eindeutig besser für statische Felder.


Blah blah. Laut Dreamora ist ganz BMX blöde und man sollte alles nach seinen wünschen umändern..blah blah. Shocked
Man kommt auch sehr gut mit dem Begriff Global klar und der Begriff wirkt auch logisch. Immerhin sind Type interne Funktionen und Variablen von außen, innen und über Instanzen erreichbar. Das klingt doch auch schon so Global Wink
Kurz gesagt, ich finde beides passend. Wer dennoch von den Begriffen verwirrt ist, kann ja nachfragen oder in die Hilfe schauen.
Die Benutzung von den dem Zeug bleibt wohl jedem selbst überlassen. Gibt ja auch Leute die Goto benutzen oder Directincludes haben wollen. Laughing
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Jolinah

BeitragDi, Jun 13, 2006 1:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte ja auch nur wegen der Verwirrung Wink Für Leute die nicht schon vorher etwas mit OOP zu tun hatten ist es so halt unter Umständen schwieriger zu verstehen, was ein statisches Feld ist, bzw. wo der Unterschied zum normalen Global ist.

Ich selber hab mich schon an die Syntax gewöhnt und BlitzMax gefällt mir eigentlich sehr gut.
 

Dreamora

BeitragDi, Jun 13, 2006 7:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Suco: Ich sagte weder das es blöd noch schwer ist. Das Problem ist lediglich das BM die Bezeichnung global für min. 2 verschiedene Dinge verwendet:

1. Globals die man einfach so oder in einem Type deklariert
2. Globals die man in einer Funktion oder einem anderem Scope definiert

Und bereits in diesen 2 Fällen ist bereits etwas sehr unterschiedliches damit gemeint!

1. definiert eine Variable die überall existiert (zumindest innerhalb des aktuellen Namespaces, damit Types gleich mitabgedeckt sind)
2. hingegen definiert eine Variable, die auch nach Beendigung des aktuellen Scopes weiter bestehen bleibt und beim nächsten Erreichen des Scopes immer noch den alten Wert beibehält

Wie gesagt, ich persönlich sehe das nicht als schwer an. Aber ich finde die mehrfachnutzung des gleichen Keywords für elementar andere Aufgaben als kritisch an.
Ist in etwa so kritisch, wie die Möglichkeit, Funktionen lokal machen zu können (sprich eine Funktion innerhalb einer anderen Funktion) ...

Das sind einfach Dinge, die man anders definitiv sauberer und konsistenter hätte lösen können (sicher, das mit den Funktionen hätte, vorausgesetzt das Mark Lust hat private - public - protected bei den Type Eigenschaften mit einzuprogrammieren, bedeutend eleganter gelöst werden können)
Andere Dinge sind aktuell noch garnicht gelöst und werden hoffentlich noch hinzugefügt (wie Delegates -> Method Pointer)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Regenbogen

BeitragMo, Feb 25, 2008 8:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein simples Menü unter BB2D:

Code: [AUSKLAPPEN]
Graphics 800,600                                                       
Maus  = LoadImage ("Mauszeiger.bmp")       ; Läd ein Mauszeigerbild


.Hauptmenue
Repeat
   SetBuffer BackBuffer()
   Cls
   Rect  300,100,200,100,0                 ; Zeichnet 2 Rechtecke
   Rect  300,400,200,100,0
   Text  400,150,"C R E D I T S",1,1       ; In einem steht "Credits"
   Text  400,450,"E N D E"      ,1,1       ; Im andern steht "Ende"
   If ImageRectCollide(Maus,MouseX(),MouseY(),0,300,100,200,100) Then
      If GetMouse () = 1 Then Gosub Credits          ; Klick --> weiter zu Credits
   End If
   If ImageRectCollide(Maus,MouseX(),MouseY(),0,300,400,200,100) Then
      If GetMouse () = 1 Then End                    ; Klick --> Programmende
   End If
   DrawImage Maus, MouseX(), MouseY()
   FlushMouse
   Flip
Forever


.Credits
Repeat
   SetBuffer BackBuffer()
   Cls
   Rect  300,250,200,100,0                  ; Zeichnet ein Rechteck
   Text  400,300,"Z U R Ü C K",1,1          ; in dem "Zurück" steht
   If ImageRectCollide(Maus,MouseX(),MouseY(),0,300,100,200,100) Then
      If GetMouse () = 1 Then Return        ; Klick --> zurück zum Hauptmenü
   End If                                                                                                           
   DrawImage Maus, MouseX(), MouseY()   
   FlushMouse
   Flip
Forever


Wie sieht dieses Programm objektorientiert aus?
Ich raff's einfach net.
Die Buttons sollen Objekte sein. Die Größe der Buttons unveränderbar (also private).
Das Schema Fenster ist ja gleich. Da kann man einen Type kopieren, bzw. vererben.

Ich hab aber keinen Plan, wie man das jetzt zusammenschustert.
Kann mir jemand dieses Programm in OOP übersetzen?
 

Dreamora

BeitragMo, Feb 25, 2008 10:50
Antworten mit Zitat
Benutzer-Profile anzeigen
1. es gibt kein private. Normalerweise macht man das mit eindeutig benannten Feldern die zeigen sollen, dass es ein privates feld ist. Wie _ als erstem zeichen oder m etc
2. Es gibt keine eindeutige OO representation. hängt davon ab wie du es machst. wenn du es mit scenes / screens machst, sind credit und hauptmenü instanzen dieser Screen Klasse und existieren eigenständig, gelinkt über den einen oder anderen weg, zb als "nextScene" im Button (Gadget Klasse oder dergleichen) oder was auch immer ...

Du siehst, das ganze ist nicht eine 2 Minuten sache, da musst du dir erst überlegen was du erreichen willst und wie und es dann stück für stück (grob nach detailiert) weiter und weiter implementieren.
Das wird nicht einfach vom himmel fallen und wenn du 0 erfahrung mit OO hast wirst du es gewiss einige male umschreiben.

falls du allerdings die demo hast, kannst du dir die mühe sparen. Dann schau einfach ob dir syntax gefällt und kauf bm oder geh zurück zum alten blitz.
Die BM demo ist total veraltet und es werden insofern auch keine Fragen im zusammenhang mit ihr beantwortet weil das reale BM nichts mehr damit zu tun hat (noch überhaupt noch syntax kompatibel ist, gibt eine ganze reihe befehle die es nimmer gibt / neu gibt / elementar anders funktionieren)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Mo, Feb 25, 2008 11:13, insgesamt einmal bearbeitet
 

Regenbogen

BeitragMo, Feb 25, 2008 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke dir Dreamora für deine aufschlußreiche Antwort.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group