Volledige versie bekijken : Class error
The Crimer
%Europe/Berlin %760 %2007, 19:15
Hoi ff's
Ik ben bezig met een kleine class te maken maar ik heb een error.
Als ik num2:Number = null doe dan geeft hij deze error
1184: Incompatible default value of type Null where Number is expected.
Hoe zou ik een number zo in mijn class kunnen zetten dat hij geen waarde nodig heeft?
Alvast bedankt.
BernardV
%Europe/Berlin %764 %2007, 19:20
Als je in je class buiten een functie een Number wilt declareren kun je gewoon:
private var myNumber:Number; gebruiken als dat is wat je bedoeld. "private" hangt natuurlijk af van je doel..
The Crimer
%Europe/Berlin %766 %2007, 19:23
Sorry ik was vergeten erbij te zeggen dat het in een functie is tussen de (haakjes)
Oeps te snel gelezen maar hij werkt nu bedankt
Alleen hoe kan ik er voor zorgen dat je de zelfde functie kan gebruiken maar dan die num 2 in het midden kan weg laten
public function Random(num1:Number, num2 = null, type:String = null) {
Want als ik dit probeer
var testt:Testing = new Testing()
testt.Random(50, "floor")
Dan doet hij het niet
Alvast bedankt
lordbeezdje
%Europe/Berlin %808 %2007, 20:24
een optioneel argument overslaan, om vervolgens een ander optioneel argument wel door te sturen kan niet, flash telt gewoon de argumenten die binnenkomen (logisch).
Wat altijd het makkelijkst is bij meerdere optionele argumenten is
1: de argumenten op volgorde van gebruik in de functiedeclaratie zetten. D.w.z. de argumenten die je het vaakst overslaat als laatste in de argument list zetten.
2: geen losse argumenten invoeren, maar een object als argument gebruiken
public function Random(arguments:Object) {
//
}
en dat gebruik je dan als volgt:
var testt:Testing = new Testing();
testt.Random({num1:50, num2:100, type:"floor"});
en zonder num2 wordt dat automatisch:
var testt:Testing = new Testing();
testt.Random({num1:50, type:"floor"});
The Crimer
%Europe/Berlin %812 %2007, 20:29
Oke maar is het ook mogelijk om het zoder dat num1: num2: type: te doen?
Flash telt gewoon de argumenten die binnenkomen (logisch).
Daar heb je 100% gelijk in
--Edit--
En hoe zou ik die data er uit moeten halen (ik heb nog nooit met objects gwerkt)
lordbeezdje
%Europe/Berlin %814 %2007, 20:32
nee, je zult binnen een object namen moeten geven, hoe kun je ze er later anders uithalen, met de mogelijkheid er een of meerdere over te slaan. als je ze zonder naam invoert, moet je gaan tellen en ben je weer terug bij af
The Crimer
%Europe/Berlin %815 %2007, 20:33
Oke en hoe haal ik die data er uit?
--Edit--
Ik heb het al gevonden gewoon object_naam.object_data <--- dit werkt niet
Ik was vergeten mijn as file te opslaan.
Dus nogmaals hoe haal ik de data er uit?
BernardV
%Europe/Berlin %822 %2007, 20:44
Je kunt in AS3 ook function test(...args) gebruiken waarbij args dan een array is met alle argumenten. Wel met de drie punten ervoor!
Ook kun je argumenten een wildcard geven op het type.
function test(myArgument:*){}
Dat mag alles zijn.. dus kun je ook null toewijzen.
Of dat de goede manier is om te programmeren.. nee, vind ik niet, maar het kan wel :) Er zijn wel uitzonderingen waar het handig is...
The Crimer
%Europe/Berlin %824 %2007, 20:47
Zou je dat mischien wat beter kunnen uitleggen want ik snap het nog niet helemaal.
lordbeezdje
%Europe/Berlin %827 %2007, 20:51
voor zover ik weet zul je ook in die constructie je argumenten in de args array een naam moeten geven om ze apart aan te kunnen roepen, of gaan tellen...
The Crimer
%Europe/Berlin %829 %2007, 20:53
(*piep*) Ik dacht dat as3 ongeveer als as2 was maar ik snap dit totaal niet die objects argumenten en constructies.
Ik moet nog veel leren
BernardV
%Europe/Berlin %839 %2007, 21:08
ok stel:
function test(...args):void
{
trace(args[0]);
trace(args[1]);
}
test("Argument 1", "Argument 2");
Zo traced hij dus beide argumenten, omdat args een array is kun je ook de properties van een array gebruiken, zoals length etc.
Gebruik je een wildcard kun je alles in je argument zetten.
de aanroep "typeof" geeft je een type van het Object terug.
function test(myArgument:*):void
{
trace(typeof myArgument);
}
test("Argument 1");
test(1);
test({objectItem1:"test"});
Dit zal tracen:
string
number
object
En dat komt precies overeen met de argumenten die meegegeven worden.
The Crimer
%Europe/Berlin %849 %2007, 21:23
Oke dat snap ik nu maar hoe kan je het in een if else zetten want argument[1] is niet altijd een number en ook niet altijd een string
Ik heb dit al geprobeerd
if(typeof argument[1] == Number){
trace("argument[1]")
}
Maar dan geeft hij deze error:
1176: Comparison between a value with static type String and a possibly unrelated type Class.
En met "Number" doet hij niets
Hoe zou ik dan de type kunnen uitlezen?
Alvast bedankt
lordbeezdje
%Europe/Berlin %850 %2007, 21:24
Op zich vrij logisch, maar wat als je meerder optionele argumenten hebt van hetzelfde datatype? Dan zou je noch met de length van de array, noch met de datatype van de argumenten precies kunnen achterhalen welke argumenten je nou wel en welke je niet hebt doorgestuurd.
Ik blijf denk ik bij named object properties, of een associatieve array, om de code zo flexibel mogelijk te houden, zonder extra loops of checks te moeten schrijven in je functies.
lordbeezdje
%Europe/Berlin %851 %2007, 21:26
@auto_scoorter_number_1
de functie typeof geeft een string waarde als return variabele, dus dat zou in de vergelijking moeten zijn
if(typeof(args[1]) == 'Number') {
trace(args[1]);
}
The Crimer
%Europe/Berlin %852 %2007, 21:27
Ja en ik wil de datatype achteralen.
Het maakt mij niet veel uit dat ik dan 1 keer meer moet schrijfen want daarna is het toch veel makkelijker voor mij.
The Crimer
%Europe/Berlin %854 %2007, 21:30
Hij tracet niks maar de data hoor wel een number te zijn.
lordbeezdje
%Europe/Berlin %855 %2007, 21:31
en als je de if-statement weglaat?
trace(typeof(args[1]));
The Crimer
%Europe/Berlin %857 %2007, 21:35
Hij geeft hem lowercase.
dus niet Number maar number
en met de if else erbij doet hij het nu wel
Lordbeezdje en BernardV heel erg bedankt voor jullie hulp.
Mischien komt er nog een vraag bij maar ik denk het niet.
The Crimer
%Europe/Berlin %865 %2007, 21:45
Wel dus
Ik heb nu dit:
package clas{
public class Testing {
public function Random(...argument:*){
if (typeof(argument[1]) == 'number') {
if(typeof(argument[2] == 'string')){
if(argument[2] == "floor"){
var Random:Number = Math.floor(Math.random()*argument[0]+argument[1])
return Random
}else if(argument[2] == "round"){
var Random:Number = Math.round(Math.random()*argument[0]+argument[1])
return Random
}
}else{
var Random:Number = Math.random()*argument[0]+argument[1]
return Random
}
}
}
}
}
Maar hij tracet undefinded en geeft bij errors in de class dat hij een dubbele variable heeft.
Hoe zou ik dit kunnen veranderen?
The Crimer
%Europe/Berlin %627 %2007, 16:03
Ik heb hem meer veranderd maar nu krijg ik een error dat een else unexpected is.
Dit is mijn code:
package clas{
class Testing{
static function Say(args:*){
trace(args[0])
}
private var error:String = ""
private var Radnom:Number
static function Radnom(...args:*){
if(typeof(args[0])=='number'){
if(typeof(args[1])=='number'){
if(typeof(args[2])=='string'){
if(args[2]=="floor"){
Random = Math.floor(Math.random()*args[0]+args[1])
}else if(args[2]=="round"){
Random = Math.round(Math.random()*args[0]+args[1])
}else{
error="invaild data at argument3 "+typeof args[2]
trace(error)
}
}else{
error="invaild data at argument3 "+typeof args[2]
}
}else if(typeof(args[1])=="string"){
}if(args[1]=="floor"){
Random = Math.floor(Math.random()*args[0])
}else if(args[1]=="round"){
Random = Math.round(Math.random()*args[0])
}else{
error="invaild data at argument2 "+typeof args[1]
trace(error)
}
}else{
error="invaild data at argument3 "+typeof args[2]
trace(error)
}
}else{//deze geeft de error
error = "invaild data at argument1 "+typeof args[0]
trace(error)
}
}
}
}
Wat doe ik fout? ik heb alle if-else statmenst geopend en gesloten
Mr. Black
%Europe/Berlin %636 %2007, 16:16
Een else{} komt naar een if(). Zet alles maar 'ns mooi onder elkaar: er staat geen if() voor:
package clas
{
class Testing
{
private var error:String;
private var random:Number;
public function Testing()
{
error = new String();
random = new Number();
}
public function Say(... args)
{
trace(args[0]);
}
public function Radnom(... args)
{
if(typeof(args[0]) == "number")
{
if(typeof(args[1]) == "number")
{
if(typeof(args[2]) == "string")
{
if(args[2] == "floor")
{
random = Math.floor(Math.random()*args[0]+args[1]);
}
else if(args[2] == "round")
{
random = Math.round(Math.random()*args[0]+args[1]);
}
else
{
error = "invaild data at argument3 " + typeof(args[2]);
trace(error);
}
}
else
{
error = "invaild data at argument3 " + typeof(args[2]);
}
}
else if(typeof(args[1]) == "string")
{
}
else if(args[1]=="floor")
{
Random = Math.floor(Math.random()*args[0]);
}
else if(args[1]=="round")
{
Random = Math.round(Math.random()*args[0]);
}
else
{
error = "invaild data at argument2 " + typeof(args[1]);
trace(error)
}
}
else
{
error = "invaild data at argument3 " + typeof(args[2]);
trace(error);
}
}
else
{//deze geeft de error
error = "invaild data at argument1 " + typeof(args[0]);
trace(error);
}
}
}
PLUS
- Je bent niet altijd consequent met variabelen en typeof() (soms zonder haakjes)
- Wat is het nut van deze Class?
- Het kan véél makkelijker!
- Je code slaat nergens op (of je wil iets heel raars bereiken).
[als je wilt oefenen mag dat best: maar maak dan een rekenmachine of zoiets :)]
Succes!
The Crimer
%Europe/Berlin %642 %2007, 16:25
Dat zie ik nu ook.
Ik heb die laatste dus weg gehaalt en ik krijg nu deze errors
1168: Illegal assignment to function Random.
1120: Access of undefined property error.
Op de plekken waar ik error een waarde geef en Random
Over dat PLUS
- Dat had ik nog niet gezien
- Om via mijn eigen class een random nummer te maken die je ook nog kan afronden
- Dat dacht ik al
- Hoezo?
[Ja ik ben aan het oefenen maar een rekenmachine is alleen maar num1(= - / *)num2=num3 en ik wil een random nummer maken zoder alle Math.functions]
The Crimer
%Europe/Berlin %621 %2007, 15:55
Hoe zou ik die errors weg kunnen halen?
Ik kan ook niet per if-else statement de zelfde vars maken.
Mr. Black
%Europe/Berlin %606 %2007, 15:33
Ik heb even het hele topic doorgelezen. Het is me nog niet helemaal duidelijk wat je wilt doen, maar wel deels. Je geeft een 1 of 2 getallen, en vervolgens wil je daar een random nummer uitkrijgen? Bij 1 getal gewoon Math.random() * number1; en bij 2 getallen Math.random() * number1 + number2 (zo staat het nu in je code iig).
Dat zou ik dan alsvolgt aanpakken:
package
{
public class RandomNumber
{
private var number1:Number;
private var number2:Number;
private var method:String;
public static const FLOOR:String = "floor";
public static const ROUND:String = "round";
public function RandomNumber()
{
}
public function getNumber( _method:String, _number1:Number, _number2:Number = 0 ):Number
{
method = _method;
number1 = _number1;
number2 = _number2;
var result:Number = Math.random() * number1 + number2;
switch ( method )
{
case FLOOR :
result = Math.floor( result );
break;
case ROUND :
result = Math.round( result );
break;
default :
result = 0;
}
return result;
}
}
}
Als volgt aan te roepen:
var number:RandomNumber = new RandomNumber();
var randomNumber:Number = number.getNumber( "round", 5, 7 );
trace( randomNumber )
Als ik je uitleg verkeerd heb begrepen / je iets niet snapt, zeg het dan maar even.
Succes! :)
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.