Type - Vererbung

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: Type - Vererbung

BeitragSa, Mai 14, 2011 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Dass ich diese Frage stellen muss tut mir irgendwie leid, aber ich raffs nicht. Warum funktioniert folgender Code nicht:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Type T1
Global v1:Int = 5
End Type

Type T2 Extends T1
Global v2:Int = v1
End Type

Print T2.v2


Es wird immer mit "v1 doas not exist" in T2 abgebrochen. Mach ich was falsch, oder geht das mit der Vererbung in globalen Variablen nicht?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

mpmxyz

BeitragSa, Mai 14, 2011 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier gibt es wohl einen kleinen BlitzMax-Bug:
BlitzMax: [AUSKLAPPEN]
Type T1
Global v1:Int = 5
End Type

Type T2 Extends T1
Global v2:Int = T2.v1 'Mit vorangestelltem T2 funktioniert es. Globale Variablen der Klasse T2 können auch ohne diesen Vorsatz benutzt werden.
End Type

Print T2.v2

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Der Eisvogel

BeitragSa, Mai 14, 2011 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, das ist ja dann wieder so als wäre es ohne Vererbung. Schade, dann wird das wieder nen Haufen Scheibarbeit.
Danke dir.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Suco-X

Betreff: ....

BeitragSa, Mai 14, 2011 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist sicherlich kein Bug. Globale Variablen und Funktionen sind zum Glück nicht vererbbar. Man kann aber über Methoden auf die Variable der Super Klasse zugreifen.

Code: [AUSKLAPPEN]

Strict


Type T1
   Global val:Int = 100
   
   Function Create:T1()
      Return New T1
   End Function
   
   Method ChangeVal(val:Int)
      Self.val = val
   End Method
   
End Type


Type T2 Extends T1
   Global val:Int = 200

   Function Create:T2()
      Return New T2
   End Function
   
   Method ChangeVal(val:Int)
      Self.val = val
      Super.ChangeVal(val+1000)
   End Method
   
End Type


Local obj:T2 = New T2
Print T2.val
obj.ChangeVal(100)
Print T2.val
Print T1.val


Dank der nicht Vererbung können beide Klassen Funktionen und Globale Variablen mit gleichen Namen enthalten ohne dass sie sich in die Quere kommen.

Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

mpmxyz

BeitragSa, Mai 14, 2011 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wie es Vererbung von Funktionen und globalen Variablen gibt!
Polymorphie gibt es gratis dazu:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Framework brl.StandardIO
Type T1
Global abc:Int
Function Foo()
Print("T1.Foo")
EndFunction
Function Bar()
Print("T1.Bar")
EndFunction
EndType
Type T2 Extends T1
Function Bar()
Print("T2.Bar")
EndFunction
Method Test()
Foo()
EndMethod
EndType
T2.Foo()

Local objT2:T2=New T2
Local objT1:T1=objT2

objT1.Bar()
objT2.Test()

Print T2.abc

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Jolinah

BeitragSo, Mai 15, 2011 13:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist von mir aus ein Bug Very Happy

Wenn man doch exakt sagt man will den Type T2 und davon die statische Funktion Foo(), dann dürfte er eigentlich nicht auf T1 zurückgreifen. Denn hier wird ja kein Objekt angesprochen, sondern wirklich der Type. Das gleiche in der Methode Test(), dort müsste er schon beim Kompilieren sagen dass er kein Foo() in T2 findet.

Das objT1.Bar() verhält sich meiner Meinung nach aber richtig. Egal was man für ne Variable verwendet, das Objekt ist vom Type T2. Und die statische Funktion Bar() sollte daher auch in T2 gesucht werden. Obwohl ich hier sowieso wieder T2.Bar() geschrieben hätte. Es macht einfach keinen Sinn eine statische Funktion über ein Objekt aufzurufen.

Edit: Das gleiche übrigens auch bei Suco-X: Self.val = val hätte eigentlich eher T1.val = val heissen müssen imho.

Naja, so sehe ich das jedenfalls. Fakt ist, es scheint bei BMax anders zu sein als bei üblichen Programmiersprachen, muss ich mir merken Wink

BladeRunner

Moderator

BeitragSo, Mai 15, 2011 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Selbstredend können auch statische Funktionen vererbt werden, was daran sollte ein Bug sein? Wenn der erbende Typ sie in dieser Form nicht braucht kann er sie ja überschreiben.
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

mpmxyz

BeitragSo, Mai 15, 2011 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@Jolinah
Dann wäre auch Java verbugt:
Code: [AUSKLAPPEN]
public class Base {
   public static void blah()
   {
      System.out.println("It works!");
   }
}

Code: [AUSKLAPPEN]
public class Sub extends Base{

}

Code: [AUSKLAPPEN]
public class Test {
   public static void main(String[] args) {
      Sub.blah();
   }
}

Die Möglichkeit, Polymorphie bei statischen Methoden zu nutzen, gibt es in Java nicht.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Jolinah

BeitragSo, Mai 15, 2011 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem Bug war nur ein Scherz Wink Ich kenne es halt einfach nicht anders, aber ich sehe ihr habt recht. Ich habe das eben in C++ und C# versucht und dort funktioniert es genau so. Vielleicht sollte ich auch mal wieder hinter die Bücher... Embarassed Keine Ahnung wie ich das bisher nicht bemerken konnte.

Edit: In C# ist es jedoch nicht möglich statische Funktionen über ein Objekt aufzurufen. T2.Foo() geht auch dort, obwohl er schon beim IntelliSense andeutet dass es in Wirklichkeit T1.Foo() ist. Und ich persönlich habe in so einem Fall halt immer direkt T1.Foo() aufgerufen, da es für mich keinen Sinn macht dies über T2 aufzurufen. Daher habe ich das auch nicht wirklich bemerkt Wink Einzige Ausnahme: Wenn man fremden Code verwendet und den Code zu wenig kennt, schreibt man vermutlich schon eher Button.StatischeVariable, selbst wenn diese in Wirklichkeit in der Klasse Control wäre oder so.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group