konstante objekte?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

FredFeuerstein

Betreff: konstante objekte?

BeitragFr, Dez 28, 2007 3:50
Antworten mit Zitat
Benutzer-Profile anzeigen
folgendes problem: ich würde gerne ein konstantes objekt anlegen.

die klasse von der ich gerne ein konstantes objekt anlegen möchte sieht in etwa folgendermaßen aus
Type RGB
...

'PUBLIC
Function createRGB:RGB(r:Int, g:Int, b:Int)
Local rgb:RGB = New RGB

rgb.init(r, g, b)
Return rgb
EndFunction

...
EndType

und nun die klasse in der ich gerne ein kostantes objekt von RGB anlegen möchte
Type Color
und nun das konstante objekt und mein problem
Const COLOR_WHITE:RGB = RGB.createRGB(255, 255, 255)

...
EndType

der compiler meint immer das ich ein konstantes objekt benötige um eine konstante anzulegen (muhaha, wenn ich eins hätte, müßt ich keins anlegen Wink): "Compile Error: Constant initializers must be constant"

habe mich mit der zeit ja schon damit abgefunden das so einiges anders ist als bei anderen objektorientierten programmiersprachen bzw. gar nicht erst geht, aber das jetzt auch noch Sad

deswegen nun meine frage:
mach ich hier irgend etwas extrem falsch, hab ich einen denkfehler, oder geht das wirklich nicht und wenn nein, kann mir eventuell jemand eine alternative nennen? mir fällt nämlich leider keine saubere ein Sad

ChaosCoder

BeitragFr, Dez 28, 2007 4:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst etwas falsch. Eine Funktion ist nie konstant.
Code: [AUSKLAPPEN]
Const COLOR_WHITE:RGB = RGB.createRGB(255, 255, 255)
Ist also demnach falsch.
Allerdings weiß ich keine andere Lösung in dieser Hinsicht... Ich denke aber auch dass es da keine alternativ Lösung geben wird, wie man n konstantes Objekt erzeugt... (Ich glaube zu wissen dass es in anderen Programmiersprachen konstante Funktionen gibt, bin mir da aber auch nich grad so sicher, außerdem würde dir das ja eh nix bringen Razz )

Also heißts wohl: "Probier's anders Wink"
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

Casiopaya

BeitragFr, Dez 28, 2007 4:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Morgen,
das was du möchtest ist technisch unmöglich. Very Happy. Konstanten werden durch einen Präprozessor vor dem eigentlichen Kompilieren durch den eigentlichen Wert ersetzt, nichts weiter. Wenn du also schreibst:

Code: [AUSKLAPPEN]
Const b=255


werden alle Vorkommen von "b" durch "255" ersetzt, die obere Zeile Code wird gar nicht beim Kompilieren beachtet. Ein "konstantes Objekt" wäre demnach irgendein Speicherbereich mit fester Adresse und festem Inhalt. -> Das gibts in keiner Sprache, spricht gegen alles wofür die OO steht.

Deshalb kannst du auch keine "konstanten" Objekte anlegen.

@ChaosCoder:
Du meinst vermutlich statische Methoden. Das ist was anderes. Diese Methoden sind lediglich nicht an an konkretes Objekt gebunden (d.h. werden nach dem Instantiieren des Objekts bereitgestellt), sondern werden "statisch" von der Klasse angeboten.

Grüße

ChaosCoder

BeitragFr, Dez 28, 2007 4:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm mein ich? Ach weiß ich doch nich, naja schön dass das jetzt geklärt ist Very Happy
Projekte: Geolaria | aNemy
Webseite: chaosspace.de
 

FredFeuerstein

BeitragFr, Dez 28, 2007 11:43
Antworten mit Zitat
Benutzer-Profile anzeigen
erst mal danke für eure mithilfe!

glaube hab mich falsch ausgedrückt. wenn ich jetzt z.b. java benutzen würde, würde ich so was schreiben:
Code: [AUSKLAPPEN]

    public class RGB {
        ...
        public RGB(int r, int g, int b) {
            ...
        }
        ...
    }

    public class Color {
        public static final RGB COLOR_WHITE = new RGB(255, 255, 255);
        ...
    }     

und das würde ich jetzt auch gerne unter BlitzMax machen.

ich möchte kein konstantes objekt an sich, sondern ein konstanten "zeiger" bzw. eine konstante "referenz" auf ein objekt. sprich, ich will das ich, in dem obigen beispiel, COLOR_WHITE nicht auf ein anderes objekt umbiegen kann, also z.b. später im code nicht sagen kann COLOR_WHITE = New ... .
das Objekt, auf welches COLOR_WHITE verweist, kann so nicht "konstant" sein, das ist klar. dies kann man ja aber darüber erreichen das man keine set-funktionen zur verfügung stellt welche das objekt verändern können. was ja hier leider auch nicht 100% geht, weil man ja nichts private machen kann, oder etwa doch und ich weiß mal wieder nur nicht wie? wenn ja könnte mich mal bitte jemand aufklären *anfleh*?
 

Dreamora

BeitragFr, Dez 28, 2007 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Definier sie einfach als global in nem Type, das ist gleichbedeutend mit Static fields in JAVA / C++
Musst halt nur dran denken dass du net dran rummurksen kannst.


Const kann nicht mit Dingen genutzt werden in BM die garnicht Const sind.
Java kann das in erster linie weils nie endkompiliert wird. Sprich es kann auch pseudo konstanten haben die es dann später zur laufzeit initiert.
C/C++ umgeht das mit Macros, das unterstützt BM jedoch nicht sofern du nicht die BMK sources nimmst und es implementierst.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

FredFeuerstein

BeitragFr, Dez 28, 2007 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora
hmmmmm, laß mich mal kurz überlegen von wegen implementieren ...... nö. wenn ich mal zu viel zeit und mehr erfahrung habe, überlege ich mir das vielleicht mal Wink
aber solange mache ich dann doch wohl lieber ein kleines workaround wie du es vorgeschlagen hast und lege anstatt konstanten dann halt einfach global attribute an die ich dann eben behandeln tue als wären es "konstanten".
ist zwar nicht unbedingt die sauberste lösung, aber man muß halt mit den mitteln arbeiten die man zur verfügung gestellt bekommt, nicht wahr Smile

trotzdem fettes danke an alle
 

Dreamora

BeitragFr, Dez 28, 2007 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du die globals in einem Type ablegst hast du da eine relativ optimale Lösung ja.

Weill dann kannst du sie mit TypeName.GlobalenVariablenName direkt ansprechen, aber es gibt keine Namenskollisionen, da deswegen GlobalenVariablenName nicht betroffen ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Casiopaya

BeitragFr, Dez 28, 2007 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch ein Anhang:

http://zehr.de/downloads/BlitzMax-OOP.pdf

scheint alle OO-Features von BM aufzulisten. Wie man sieht gibt es zwar ein Schlüsselwort "final", allerdings hat das nicht die Bedeutung von "final" unter Java, sondern anscheinend die von "sealed" unter C#. Also, dass man einen Typ/eine Methode nicht ableiten/überschreiben kann. Musst also wohl wirklich ne Globale Variable nehmen und diese halt nie verändern Smile

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group