PDA

Volledige versie bekijken : static var in Class


FlashElements
%Europe/Berlin %663 %2005, 16:55
Hallo allemaal,

Ik ben even wat aan het testen, maar kom hier niet helemaal uit.
Wat gaat er mis ?

class SomeClass {
private static var obj:SomeClass;
private var prop:Number = 10;

public static function doSomething():Void {
obj = new SomeClass();
trace(obj.prop);
}
}

output :

**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 3: Static members can only be accessed directly through classes.

iemand een idee ?

Dauntless
%Europe/Berlin %681 %2005, 17:20
//edit:

Ok, wat hier stond sloeg op niets... 'k zal nog es kijken :p

//edit 2
Hoe roep je hem op??

Roenes
%Europe/Berlin %682 %2005, 17:23
Heb je dat getest Dauntless? Ik niet, maar volgens mij krijg je nu nog een error omdat prop private is. (of mag dit omdat je in de class zit?)

Ik kan het hier niet testen, heb geen flash bij de hand. :)

//Edit
Een beetje snel je reactie verwijderen he, slaat mijn reactie weer nergens op ;)

Dauntless
%Europe/Berlin %683 %2005, 17:24
Sorry Roenes, 'k had juist m'n post verwijderd :p
(En mijn reactie was verwijderd vóór jouw post! :p)

public static function doSomething():Void {
obj = new SomeClass();
trace(obj.prop);
}

die obj = mag dus niet omdat obj een statische member is van je class... Het moet eerder iets zijn als:

SomeClass.obj = new SomeClass(); (maar pas op dat je dit niet in je contructor zet want 'k denk dat als je hem dan oproept, dat je een infinite loop hebt).

Roenes
%Europe/Berlin %685 %2005, 17:26
Even terug naar de vraag. Wat probeer je precies te bereiken. Want wat ik eruit opmaak is dat je een class maakt die een property heeft (obj) die static moet zijn maar die moet verwijzen naar je class. Dus

trace(SomeClass.obj);
zou SomeClass moeten opleveren in jouw voorbeeld. Vink niet logisch. Zou dus ook niet weten hoe ik je zou kunnen helpen met dit probleem. Zou je misschien iets meer kunnen vertellen wat je wilt bereiken? :)

FlashElements
%Europe/Berlin %742 %2005, 18:49
Eigenlijk probeer ik wat testjes te doen uit mijn boek.
Volgens Collin Moock zou dit dus gewoon moeten werken in AS.
Maar dat is dus niet het geval... probeer er achter te komen wat dan wel de oplossing, vandaar dus even dat ik het voorleg aan mede actionscript ontwikkelaars :-)

Dauntless
%Europe/Berlin %746 %2005, 18:54
Volgens Collin Moock zou dit dus gewoon moeten werken in AS.
EAS 2.0 neem ik aan? Welke pagina?

//Edit
Ok, pagina 93 dus :).

Je hebt idd compleet hetzelfde... Vreemd dat hij zegt dat het zou moeten werken (of vreemd dat het bij ons niet werkt...).

Je zou eens in hoofdstuk 17 naar het Singleton pattern moeten kijken. Misschien dat die iets verklaart...

Hij zegt dat een class aan class properties zou moeten graken... Wat ook eigenlijk wel logisch is... Dit zou dus in principe idd moeten werken!
Ik ben nu even door, maar 'k ga straks nog eens zoeken :)

Roenes
%Europe/Berlin %771 %2005, 19:30
Toch handig dat iedereen dat boek heeft ;) (zelf benk nog nie op pagina 93 ;))

Toch heb ik even zitten lezen. Ik denk dat het bij jouw fout gaat met de manier van aanroepen. Hoe en wat roep je aan in Flash? Als ik de class kopieer naar een AS file en ik roep dit aan in flash werkt het perfect:
SomeClass.doSomething();Als ik echter dit doe:

var s = new SomeClass();
s.doSomething();
Zie ik niets. Jouw foutmelding krijg ik iig niet voor elkaar ;)

Het bovenstaande klopt overigens wel. Optie 1 werkt omdat doSomething een static methode is. Hierdoor wordt het een methode die je aan de class koppelt en niet aan een instantie. Denk maar aan de Math class. Deze heeft ook allemaal static methodes. Dat merk je doordat je van Math nooit een object maakt, denk maar aan Math.pow() en Math.random() enz enz.

doSomething moet je dus aanroepen door de naam van de Class aan te geven en dan pas de methode. via optie 2 werkt het niet, omdat je eerst een object maakt van SomeClass en via dat object de methode wilt aanroepen. Deze methode bestaat voor het object niet omdat het een classe methode is.

Maar dit brengt ons nog niet bij jouw foutmelding. Ik weet niet hoe je em voor elkaar krijgt, maar ik kan hem dus niet hier terug toveren. Kun je even aangeven hoe je de class gebruikt in jouw fla? Misschien maak je een foutje in je notatie of zo? Ik weet het ook niet.

Hopelijk maakt bovenstaande al wel het een en ander duidelijk :)

arshad
%Europe/Berlin %777 %2005, 19:39
als je dit doet:
class SomeClass {
private static var obj:SomeClass;
private var prop:Number = 10;

public function doSomething():Void {
obj = new SomeClass();
trace(obj.prop);
}
}
Dan werkt die wel. Het is de static-attribute bij doSomething die voor problemen zorgt.

arshad
%Europe/Berlin %778 %2005, 19:40
Oooh nu snap ik et...thanks Roenes ;)

FlashElements
%Europe/Berlin %785 %2005, 19:51
Roenes je hebt gelijk het zit 'm in de mannier waarop je de class aanroept.

Ik kreeg de fout op deze mannier :


var s:SomeClass = new SomeClass();
s.doSomething();

SomeClass moet ik dus niet als type gebruiken voor de var s.
Ik zal ook het Singleton patroon doornemen.

//edit

ik zie inderdaad niets terwijl ik 10 moet zien toch ?

Roenes
%Europe/Berlin %811 %2005, 20:29
//edit
ik zie inderdaad niets terwijl ik 10 moet zien toch ?Jepz, maar lees nog eens goed wat ik vertel en kijk eens naar je eigen reactie:
Roenes je hebt gelijk het zit 'm in de mannier waarop je de class aanroept.static maakt van de methode een class methode. Deze kun je dus niet vanuit een instantie oproepen. Dus niet eerst een object aanmaken van SomeClass :)

FlashElements
%Europe/Berlin %833 %2005, 21:00
Euhmmm ja klopt was even niet helemaal wakker, het werkt gewoon met

SomeClass.doSomething();


Kunnen we weer met een gerust hart verder lezen :)

Bedankt.... Roenes ... mocht ik weer leuke dingen tegen komen uit het boek, dan laat ik het even weten :D

Roenes
%Europe/Berlin %834 %2005, 21:01
Bedankt.... Roenes ... mocht ik weer leuke dingen tegen komen uit het boek, dan laat ik het even weten :DDoe dat ;) Dan zal ik ondertussen proberen je in te halen in het boek ;)

FlashElements
%Europe/Berlin %839 %2005, 21:09
Doe dat ;) Dan zal ik ondertussen proberen je in te halen in het boek ;)

Leuk, kunnen we samen even proberen het boek door te nemen.... dus mocht je dingen tegen komen ..... please shoot ;)

FlashElements
%Europe/Berlin %870 %2005, 21:52
wel handig zo' static function want je bent in 1 klap van de prototypes af :)

class SomeClass {
public static function doThis(clip:MovieClip, getal:Number):Void {
clip.onEnterFrame = function() {
this._rotation += getal;
};
}
}

Roenes
%Europe/Berlin %902 %2005, 22:40
wel handig zo' static function want je bent in 1 klap van de prototypes af :) Niet helemaal ;) een static methode is een methode die je alleen vanaf de classe kan benaderen. Als je een vroegere prototype gebruiktte, voegde je een methode toe aan een classe, maar deze was vanuit iedere instantie te benaderen. Dit is hetzelfde als een gewone methode in een classe definieren. Want die methode bereik je door eerst een object van een classe aan te maken en daarna pas de methode aan te roepen :)

Dauntless
%Europe/Berlin %940 %2005, 23:34
Doe dat ;) Dan zal ik ondertussen proberen je in te halen in het boek ;)
Pagina 349; Try and catch me ! ;)

En wat misschien ook handig is: een static class genaamd 'utils' maken en die dan gebruiken voor je static functions.

FlashElements
%Europe/Berlin %995 %2005, 00:54
He, Roenes al iets verder met het boek ? :) ..........

Roenes
%Europe/Berlin %499 %2005, 12:59
Mwa niet echt :) Ik heb em wel in me schooltas gestopt om em in de trein te lezen maar er komt nog maar weinig van terecht :D

Ik zit nog ergens in hoofdstuk 2 of 3 of zo. Moet echt eens de tijd nemen om te lezen. Ben jij wel verder gegaan met lezen? :)

Voetsjoeba
%Europe/Berlin %503 %2005, 13:05
Niet helemaal ;) een static methode is een methode die je alleen vanaf de classe kan benaderen. Als je een vroegere prototype gebruiktte, voegde je een methode toe aan een classe, maar deze was vanuit iedere instantie te benaderen. Dit is hetzelfde als een gewone methode in een classe definieren. Want die methode bereik je door eerst een object van een classe aan te maken en daarna pas de methode aan te roepen :)

AS 2.0 is in feite een wrapper rond AS 1.0, een nieuwe syntax om AS 1.0 te schrijven. Het hele class-block is eigenlijk niets anders dan een grote alias voor het prototype object in AS 1.0. Met een paar compilertrucjes werden hier dan static, public, private etc bijgevoegd, maar in feite is AS 2.0 niets anders dan een nieuwe OOP syntax rond de AS 1.0 methode van classes definieren. Tijdens het invoegen van de code in de swf wordt dan ook AS 1.0 code gegenereerd.

Roenes
%Europe/Berlin %505 %2005, 13:08
I know :)

Maar dat neemt niet weg dat AS2 makkelijker te begrijpen is in OOP als het werken met dat prototype. Over het algemeen vonden mensen dat toch vrij lastig. En daar komt bij dat AS2 nu meer lijkt op java en dergelijke waardoor het overstappen van de 1 naar de andere taal makkelijker is :)

Voetsjoeba
%Europe/Berlin %512 %2005, 13:17
Dat is waar. Prototype was een van de lastigste dingen in Flash om te leren/begrijpen, en dan kwamen daar nog dingen bij als proto chains, __proto__ etc, die het nog erger maken. Maar als je dat eenmaal begrijpt is het een gigantische sprong voorwaarts denk ik, en het is niet slecht om 'prototype' te blijven denken vind ik, omdat dat ook is hoe het uiteindelijk gebeurt. Uiterlijk is misschien handiger, maar het innerlijk moet ook gekend zijn ;)

FlashElements
%Europe/Berlin %516 %2005, 13:23
Mwa niet echt :) Ik heb em wel in me schooltas gestopt om em in de trein te lezen maar er komt nog maar weinig van terecht :D

Ik zit nog ergens in hoofdstuk 2 of 3 of zo. Moet echt eens de tijd nemen om te lezen. Ben jij wel verder gegaan met lezen? :)


Euhmmm ik moet je eerlijk bekennen dat ik daar nu ook ongeveer zit :( Even druk met alles en nog wat.... Maar binnenkort ga ik daar eens goed de tijd voornemen, gezien de nieuwe technieken binnen Flash 8 en transparante video gaan we toch weer een nieuw interactief tijdperk in ;)

//edit
Topic is een beetje off record aan het worden...

Roenes
%Europe/Berlin %524 %2005, 13:35
Dat is waar. Prototype was een van de lastigste dingen in Flash om te leren/begrijpen, en dan kwamen daar nog dingen bij als proto chains, __proto__ etc, die het nog erger maken. Maar als je dat eenmaal begrijpt is het een gigantische sprong voorwaarts denk ik, en het is niet slecht om 'prototype' te blijven denken vind ik, omdat dat ook is hoe het uiteindelijk gebeurt. Uiterlijk is misschien handiger, maar het innerlijk moet ook gekend zijn ;)Klopt, zeker als je weet hoe het innerlijk (grotendeels) gebeurd kan dat heel erg helpen bij het schrijven van code en bij het zoeken naar fouten. Zo kun je fouten ook makkelijker leren begrijpen :)

//edit
Topic is een beetje off record aan het worden...Klopt, maar dat is denk ik in dit geval niet zo heel erg. Het is nog een leerzaam en interessant onderwerp :)

FlashElements
%Europe/Berlin %536 %2005, 13:53
Ik denk dat de meeste mensen toch prototypes blijven gebruiken omdat het natuurlijk overal aangeroepen kan worden, echter voor de OOP mensen een doorn in het oog.

In OOP is het misschien iets meer programmeer werk maar infeite bereik je wel overzichtelijke code, en de classes kun je ook weer als package gebruiken.

FlashElements

Dauntless
%Europe/Berlin %643 %2005, 16:27
Ik denk eigenlijk ook wel dat je door AS 2.0 te leren, mooie AS 1.0 leert schrijven ... Je leert immers gestructureerder te werken en je denkt veel meer na over een manier van aanpakken voor je begint.

FlashElements
%Europe/Berlin %572 %2005, 14:43
Klopt helemaal....... nu met de komst van Flash 8 zie je ook weer nieuwe functies erbij voor AS 2.0, aantal dingen zijn ook weer veranderd en zo kun je bijvoorbeeld voor 1 toepassing verschillende syntaxen gebruiken, dit wekt soms beetje verwarring.. en hoop eigenlijk dat er meer consequentie in de code komt.