OOP Frage
Übersicht

![]() |
FreemanBetreff: OOP Frage |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 ![]() Fr3eMaN |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() PS: Die Liste ist mit Global in der Klasse, ausser du schreibst es ausserhalb der Klasse ![]() |
||
![]() |
rema |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
~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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist auch eine gute Lösung ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 ![]() 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. ![]() Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich dachte ja auch nur wegen der Verwirrung ![]() Ich selber hab mich schon an die Syntax gewöhnt und BlitzMax gefällt mir eigentlich sehr gut. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich danke dir Dreamora für deine aufschlußreiche Antwort. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group