OOP Verständnissproblem
Übersicht BlitzMax, BlitzMax NG Allgemein
KlaasBetreff: OOP Verständnissproblem |
Di, Feb 22, 2005 0:19 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Feb 22, 2005 1:15 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Feb 22, 2005 2:40 Antworten mit Zitat |
|
---|---|---|
@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 . |
||
Don't drink and derive! |
stfighter01 |
Di, Feb 22, 2005 2:52 Antworten mit Zitat |
|
---|---|---|
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 |
||
Denken hilft! |
tft |
Di, Feb 22, 2005 8:49 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Feb 22, 2005 9:13 Antworten mit Zitat |
|
---|---|---|
@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 |
Di, Feb 22, 2005 11:08 Antworten mit Zitat |
|
---|---|---|
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 . |
||
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net |
Klaas |
Di, Feb 22, 2005 11:22 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Feb 22, 2005 11:25 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Feb 22, 2005 12:16 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Feb 22, 2005 15:22 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Feb 22, 2005 17:00 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Feb 22, 2005 18:51 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Feb 22, 2005 22:17 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Feb 22, 2005 22:29 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Feb 24, 2005 17:08 Antworten mit Zitat |
|
---|---|---|
@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 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! |
Übersicht BlitzMax, BlitzMax NG Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group