Frage zu Type/TypeVar Prüfung
Übersicht

![]() |
remaBetreff: Frage zu Type/TypeVar Prüfung |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ... |
||
AvaGast |
![]() 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! ![]() 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? ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? | ||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Ich habe keine Ahnung. ![]() Ich brauchte sowas mal und habs dann einfach ausprobiert und mich gefreut, dass es klappt. *g* |
||
![]() |
Blacal |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group