Frage zu Type/TypeVar Prüfung

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

rema

Betreff: Frage zu Type/TypeVar Prüfung

BeitragFr, Feb 03, 2006 1:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe mal was getestet und auch kappiert, naja nicht ganz. Wie wird dies hier mit der Prüfung gehandhabt? Bzw, es ist eben nicht dokumentiert. Den auto und bus sind Types. Wiso kann man dort TypeVariabeln einsetzen?

Kann mir dies jemand mal genauer erklären?

Code: [AUSKLAPPEN]

Strict

Type fahrzeug
   Field name$
End Type

Type auto Extends fahrzeug
   Field irgendwas$
End Type

Type bus Extends fahrzeug
   Field sonstwas$
End Type


Local auto1:auto = New auto

Local bus1:bus = New bus


If auto( auto1 ) '<------- Prüfung 1 (YES)
   Print "YES"
Else
   Print "NO"
EndIf

If fahrzeug( auto1 ) '<---------- Prüfung 2 (YES)
   Print "YES"
Else
   Print "NO"
EndIf

Local auto2:auto

If auto( auto2 ) '<------- Prüfung 3 (NO)
   Print "YES"
Else
   Print "NO"
EndIf

rem
If bus( auto1 ) '<------- Prüfung 4 (Abbruch durch Compiler)
   Print "YES"
Else
   Print "NO"
EndIf
end rem

'... etc ...
 

Ava

Gast

BeitragFr, Feb 03, 2006 3:52
Antworten mit Zitat
Wenn ich es richtig verstanden habe, wunderst Du Dich, warum man eine Type-Klasse quasi als Funktion verwenden kann, richtig? Also das ist eigentlich ganz einfach erklärt und überaus nützlich! Smile

Du kannst diese Funktion mit einem beliebigen Objekt nutzen und BMax versucht dann, dieses Objekt als Type dieser Klasse zu verwenden. Das ist äusserst nützlich, wenn Du mit einer Sammlung nicht genauer deffinierten Objekten arbeitest - aber auch beim Thema Vererbung hat es mir schon oft gute Dienste geleistet.

Ein Beispiel:

Code: [AUSKLAPPEN]
Function Tu_etwas_mit_dem_Objekt( objekt:TObject )

   Select True

      Case t_auto ( objekt)

              ....

      Case t_bus ( objekt )

              ....

      Case t_bahn ( objekt )

              ....

   EndSelect

EndFunction




Alternatives Beispiel:

Code: [AUSKLAPPEN]
Function Tu_etwas_mit_dem_Objekt( objekt:TObject )

   Local auto:t_auto = t_auto ( object )
   Local bus:t_bus = t_bus ( object )
   Local bahn:t_bahn = t_bahn ( object )

   If auto Then ...
   If bus Then ...
   If bahn Then ...

EndFunction



Beispiel bei Vererbung:

Code: [AUSKLAPPEN]
Type t_waffe
   ...
End Type


Type t_waffe_nahkampf Extends t_waffe
   ...
End Type


Type t_waffe_fernkampf Extends t_waffe
   ...
End Type


Function Benutze_Waffe( waffe:t_waffe )

   Local waffe_nahkampf:t_waffe_nahkampf = t_waffe_nahkampf ( waffe )
   Local waffe_fernkampf:t_waffe_fernkampf = t_waffe_fernkampf ( waffe )

   If waffe_nahkampf Then ...
   If waffe_fernkampf Then ...

EndFunction



Ich hoffe, das war es, was Dich beschäftigt hat? Smile

Lieben Gruss, Ava




[/edit]Zitat:
If bus( auto1 ) '<------- Prüfung 4 (Abbruch durch Compiler)
Print "YES"
Else
Print "NO"
EndIf


So sollte es funktionieren:

Code: [AUSKLAPPEN]
If bus( object ( auto1 ) )
   Print "YES"
Else
   Print "NO"
EndIf

rema

BeitragFr, Feb 03, 2006 9:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Dank. Logisch erscheit es mir auf den zweiten Blick. Aber bisweil wusste ich eben nicht, dass man ein Type als Function einsetzten kann, da dies auch undokumentiert ist. Oder habe ich was übersehen?
 

Ava

Gast

BeitragFr, Feb 03, 2006 10:27
Antworten mit Zitat
Ich habe keine Ahnung. Very Happy

Ich brauchte sowas mal und habs dann einfach ausprobiert und mich gefreut, dass es klappt. *g*

Blacal

BeitragFr, Feb 03, 2006 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Servus

Sowas nennt man casting
In deinem fall hast du ne "Ist ein" Beziehung zu Fahrzeug, also
- Auto -> ist ein -> Fahrzeug
- Bus -> ist ein -> Fahrzeug

Also kannst du Auto und Bus auch als Fahrzeug betrachten
und das machst dann halt mit diesem Fahrzeug(Auto-Objekt)

Aber wenn du so castest, kannst du auch nur die Methoden und Felder von Fahrzeug aufrufen, weil dus als Fahrzeug betrachtest

Nach diesem Prinzip funktionieren auch dynamische Listen (TList)
da werden alle Einträge zu Object gecastet und wenn due die Einträge wieder rausholst, musst dus wieder zu deiner Klasse casten

rema

BeitragFr, Feb 03, 2006 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, soweit gut. Ich wäre ehr davon ausgegangen dass:

Code: [AUSKLAPPEN]

Type fahrzeug
   Field sonstwas$
End Type

Local auto:fahrzeug = new fahrzeug


if auto = fahrzeug then print "YES"


wen, dann es so funktionieren sollte. Aber tut es nicht. Obwohl es logischer wäre, da eigentlich der Type fahrzeug ja keine Function ist. Aber wie oben genannt, es aber nur so klappt, also mit dem Casting...

Wolle einfach mal wissen wie es genannt wird... also Casting... Thx!

// Edit //

Nun habs ich kappiert, wobei mir die Lösung if auto = fahrzeug ... irgendwie einleuchtender wäre...

Aber für alle BMax Nachkommen habe ich hier nochmals ein Example:

Code: [AUSKLAPPEN]
Strict

Type fahrzeug

   Field x
   Field y
   
End Type

Type auto Extends fahrzeug
End Type

Type bus Extends fahrzeug
End Type


Type flugzeug
End Type


'------------------------------

Local auto1:auto = New auto
Local bus1:bus   = New bus

test( auto1, bus1 )


Local heli:flugzeug = New flugzeug

test( auto1, heli )

Print "~n"

If auto( Object( bus1 ) ) ' ohne vorher mit Object( ) zu casten, käme eine Fehlermeldung...
   Print "YES"
Else
   Print "NO"
EndIf


'------------------------------

Function test( f1:Object, f2:Object )

   Print "~n"

   If bus( f1 ) Then Print "f1 = bus"
   If auto( f1 ) Then Print "f1 = auto"
   If bus( f2 ) Then Print "f2 = bus"
   If auto( f2 ) Then Print "f2 = auto"

   If flugzeug( f1 ) Then Print "f1 = flugzeug"
   If flugzeug( f2 ) Then Print "f2 = flugzeug"

End Function

Jolinah

BeitragFr, Feb 03, 2006 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist im eigentlichen Sinne keine Funktion, eher eine spezielle Syntax. Im Fall von BMax ist es aber ein wenig unglücklich gewählt, find ich. Es sieht halt genau gleich aus wie eine Funktion.

In C# sieht ein Int zu String-Cast z.B. so aus:
Code: [AUSKLAPPEN]
int a = 10;
Console.WriteLine( (string)a );


Man gibt vorher in Klammern an wie der nachfolgende Ausdruck gecastet werden soll. Cast heisst formen, bzw. ver- oder umwandeln.


In BMax sehen die Casts aus wie Funktionen:
Code: [AUSKLAPPEN]
Local a:Int = 10
Local b:String = String(a)
a = Int(b)


Im Unterschied zu B3D etc. sollten Int(x) und String(x) jedoch keine Funktionen sein, sondern ein Cast.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group