OOP Verständnissproblem

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Klaas

Betreff: OOP Verständnissproblem

BeitragDi, Feb 22, 2005 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ich hab mir nun BlitzMax zugezogen und finds wirklich klasse.

Aber nun hab da ein kleines Problem bzw. kein problem sonder ich versteh es nicht völlig

Code: [AUSKLAPPEN]

Type erster
   Field num:Int = 1
   
   Method New()
      Print "ich bin erster ("+num+")"
   End Method
End Type

Type zweiter Extends erster
   Field num:Int = 2
   
   Method New()
      Print "ich bin zweiter ("+num+")"
   End Method
End Type

ich1:erster = New erster
Print ich1.num

Print "---"
ich2:zweiter = New zweiter
Print ich2.num

Print "---"
ich3:erster = New zweiter
Print ich3.num

Print "---"


Ergebniss 1 und 2 sind klar

aber bei nummer 3 ... was passiert dann eigentlich mit "zweiter" ? wird das Object erstellt aber als überflüssig über Bord geworfen ?

Hier noch der Output
Code: [AUSKLAPPEN]

ich bin erster (1)
1
---
ich bin erster (1)
ich bin zweiter (2)
2
---
ich bin erster (1)
ich bin zweiter (2)
1
---

Process complete

Vertex

BeitragDi, Feb 22, 2005 1:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum ist New bei dir eine Methode? Mach daraus mal eine Funktion, die New aufruft. Bennene sie einfach in Create um.
mfg olli
vertex.dreamfall.at | GitHub
 

Demon

BeitragDi, Feb 22, 2005 2:40
Antworten mit Zitat
Benutzer-Profile anzeigen
@Vertex: Das ist schon legal das zu machen.
Die Methode mit dem Namen "New" wird aufgerufen, wenn ein Objekt mit New erstellt wird.

Zitat:
User defined types can optionally declare two special methods named New and Delete. Both methods must take no arguments, and any returned value is ignored.

The New method is called when an object is first created with the New operator. This allows you to perform extra initialization code.


@Klaas: Das ist gerade der Vorteil von OOP; man kann ohne weiteres eine Erweiterung eines Objekttyps überall dort angeben, wo eigentlich das Basisobjekt verlangt wird.
Du deklarierst "ich3" als "erster", erstellst aber die Erweiterung "zweiter" als neues Objekt.
Die Initialisierungsmethode von "erster" und "zweiter" wird aufgerufen, der Typ ist aber trotzdem immer noch "erster", deshalb überschreibt das zweite Feld "num" nicht das erste, so dass 1 herauskommt.
Alles so, wie es soll Smile.
Don't drink and derive!

stfighter01

BeitragDi, Feb 22, 2005 2:52
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst aber auch somit noch auf die variablen der erweiterten klasse zugreifen indem du dein objekt wieder castest.

Code: [AUSKLAPPEN]

Type erster
   Field num:Int = 1
   
   Method New()
      Print "ich bin erster ("+num+")"
   End Method
End Type

Type zweiter Extends erster
   Field num:Int = 2
   
   Method New()
      Print "ich bin zweiter ("+num+")"
   End Method
End Type

ich1:erster = New erster
Print ich1.num

Print "---"
ich2:zweiter = New zweiter
Print ich2.num

Print "---"
ich3:erster = New zweiter
Print ich3.num
Print zweiter(ich3).num

Print "---"


output ist dann:


Code: [AUSKLAPPEN]

ich bin erster (1)
1
---
ich bin erster (1)
ich bin zweiter (2)
2
---
ich bin erster (1)
ich bin zweiter (2)
1
2



eine echt feine sache muss man dazusagen Wink
Denken hilft!

tft

BeitragDi, Feb 22, 2005 8:49
Antworten mit Zitat
Benutzer-Profile anzeigen
HI........

ich schiesse sicher mit der Frage den Fogel ab......

wozu braucht man das? Kann man damit etwas sinnfolles machen das ohne opp nicht geht. Bringt es geschwindigkeits vorteile? Oder wird der Code Kleiner?
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!
 

Klaas

BeitragDi, Feb 22, 2005 9:13
Antworten mit Zitat
Benutzer-Profile anzeigen
@Vertex: das nennt man Constructor und Destructor .. und ist mächtig praktisch!

@stfighter01: das mit dem casten ist ne super information .. genau das hab ich gesucht !
Gibt es denn auch ne Möglichkeit herrauszufinden welchem Typ das Object angehört ?

Mein Programm soll später folgendes tun:
Ich lese aus einer Datei verschiedene "Tags" aus. Da dachte ich, ich bau mir ein Object Tag und erweitere es jeh nach den anforderungen des speziellen Tags. Wenn ich aber später alle Tags durchlaufen will um diese auszuwerten müßte ich irgendwie herausfinden was das für Objekte sind.
... oder muß ich eine zweite Liste führen in der ich die TagTypen speichere?

regaa

BeitragDi, Feb 22, 2005 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Du darfst bei OOP-Sprachen in Objekten denken, hilft ungemein. Diese Objekte können nunmal Methoden oder Globale Funktionen haben, welche für andere Objekte wiederrum sichtbat ooder unsichtbar sind. Somit ist das ganze gut gekapselt (ist zwar noch nicht so dolle möglich, kommt aber bald), und Objekt A braucht von Objekt B's Eigentum nichts zu wissen. Es sollen lediglich Schnittstellen oder Aktionen definiert werden über die Objekt A, B was mitteilt oder verändert.

Ich find es sehr stylisch. Macht sehr viel mehr Spaß, ist logischer, übersichtlicher, mächtiger, produktiver. Naja, zum Thema OOP findet man bei google eine ganze Masse Wink.
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net
 

Klaas

BeitragDi, Feb 22, 2005 11:22
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, oop ist mir nichts neues ... nur ist der Umfang und die Ausprägung verschiedener OOP basierter Sprachen sehr unterschiedlich.

Im wesentlichen würde es mir reichen zu wissen ob ich oder wie ich den Typ eines Objektes abfragen bzw. testen kann.

ich schmeiß mal einen Befehl aus einer anderen Sprache in den Raum:
if (isTypeOf(meinObject) = meineKlasse) then print "Dieses Objekt ist von der Klasse meineKlasse"

regaa

BeitragDi, Feb 22, 2005 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
If MeinTyp(ParamMeinObjekt)=MeinObekt dann ist das Objekt welches du über ParamMeinObjekt übergeben hast vom Type MeinTyp. Ich hoffe das war verständlich. Naja, schau dir mal Object an, und Stwichwort Typecasting.
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net
 

Klaas

BeitragDi, Feb 22, 2005 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
ah ja ... okay darauf hätte ich auch kommen können, danke.

Kann man sich irgendwo noch ne erweiterte Hilfe von BlitzMax holen ? .. wenn ich bei mir in der Language Reference unter Object gucke ist dort nur eine sehr dürftige Seite die grob beschreibt was ein Object ist.

stfighter01

BeitragDi, Feb 22, 2005 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst auch abfragen

if diesertyp(objekt) <> null
...
endif


[edit]
irgendwo wird an so einer blitzwiki hilfe rumgebastelt (in diesem forum ist irgendwo n thread)

am hilfreichsten ist es oft direkt das modul anzusehen und den befehl zu suchen.

mit dem docgen aus dem englisch forum kann man die hilfe zumindest in übersichtliche form bringen, aber mehr hilfe gibts sonst einstweilen nicht.
[/edit]


mfg stfighter
Denken hilft!

stfighter01

BeitragDi, Feb 22, 2005 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
dazu hab ich auch noch ne frage.

passt gut zu dem was klaas wissen wollte.

wenn ich diesen typ erstelle:

local ich:erster= new zweiter

kann ich nur auf die variablen v. erster zugreifen, bzw.: über casting auch auf zweiter.
was wenn ich nicht weiss welche instanz ich tatsächlich erstellt hab?

kann ich dann irgendwie auf die infos die der tatsachlich verwenden klasse zugreifen, ohne das ich weis um welche klasse es sich dabei handelt?
natürlich könnte ich die instanz auf alle typen prüfen, aber das erscheint mir overkill und ist zudem nicht sehr flexibel.


mfg stfighter
Denken hilft!

regaa

BeitragDi, Feb 22, 2005 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
also

local objekt:Object=Create.MeinType

objekt.x=1 meldet bei mir auf jeden Fall nen Compilerfehler.
MeinType(objekt).x=1 meldet keinen Compilerfehler.

Ich würd es schon auf den Typ hin überprüfen.
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net
 

morszeck

BeitragDi, Feb 22, 2005 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Type TType
  Field x
  Global count

  Method New()
    count :+ 1
  End Method
End Type

neu:TType = New TType
neu.x = 100

Print TType.count
'oder
Print neu.count


Also es hat Sinn das man New() auch zusätzlich definieren kann, zbsp kann man per New() gleich einen Counter einbauen...

bruZard

BeitragDi, Feb 22, 2005 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Ihr schon OOP benutzen wollt, verabschiedet Euch bitte auch von "initialisieren und vergessen" ... ein Type-Casting ist total unangebracht wenn Ihr Euch einfach nur merkt welches Objekt Ihr instanziert habt.

Warum sollte ich nach meineInstanz:MeinObject = New Mein Object vergessen dass ich eben dieses Objekt instanziert habe??

Wenn Ihr in Objekten herum pfuscht die Ihre Eigenschaften nicht dokumentieren, solltet Ihr Euch Gedanken über Euren Programmierstil machen, ein Private-Block wird nicht ohne Grund als eben solcher deklariert.
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

stfighter01

BeitragDo, Feb 24, 2005 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
@bruzard

ich mach mir jeden tag gedanken über meinen programmierstil, und bin zu dem schluss gekommen das er einfach nicht mehr verbessert werden kann 8)

na gut, aber nun zum sinn des ganzen.
stell dir vor ich habe eine liste.
diese verwaltet mir z.b.: alle meinen einheiten in einem strategiespiel

jede runde bewegen sich alle einheiten entsprechend ihrer geschwindigkeit vorwärts.

dazu stell ich mal einen einheiten typ her der position, geschw. und richtung besitzt, sowie die methoden diese zu verarbeiten.

dann leite ich noch ein paar schicke besser detailierte einheiten davon ab.
etwa schützen, reite, infantrie...


meine liste muss aber aus grundtypen bestehen, sonst könnte sie nicht alle einheiten verwalten.
wenn ich jetzt über die liste darauf zugreife, weiss ich nicht welcher typ das genau ist.
die info ist einfach nicht erhalten geblieben.
deshalb meine frage, und nicht weil ich zu dumm bin die übersicht über die verschiedenartigkeit meiner typen zu behalten.


[edit]
sorry, wies aussieht sollte ich doch noch mal gründlich über meine programmiererei nachdenken Embarassed Embarassed
es werden durch casting lediglich die variablen der base klasse angesprochen, nicht aber die methoden.
das wusst ich nicht, ist beim weitern nachdenken aber eine auch ganz vernünftige vorgehensweise.
[/edit]


mfg stfighter
Denken hilft!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group