PDA

Volledige versie bekijken : namen van klasses dynamisch invullen


duivvv
%Europe/Berlin %586 %2007, 15:05
hoe zorg ik ervoor dat de naam van de klasse die ik oproep uit een variabele komt

cfr

this["welke" + i] = 1

maar dan bevoorbeeld

als ik de DND klasse moet oproepen bv.

welke = "DND"
oefening = new [welke]()

ik heb al verschillende opties geprobeerd, maar niets lijkt te werken

iemand ?

merci !

Dauntless
%Europe/Berlin %606 %2007, 15:33
Waarom heb je dit juist nodig? Kan je de situatie even uitleggen ? :)

duivvv
%Europe/Berlin %623 %2007, 15:57
ok

ik heb verschillende oefenvormen
DND (drag and drop)
TMCC (multiple choice)
MA (multiple answer)

en die worden allemaal opgeroepen met dezelfde set van variabelen in de constructor

xml node / max pogingen etc ...

nu zou ik graag hebben dat ik aan de hand van het type in een XML, bv "DND" gewoon de klasse kan oproepen

als er dan later oefenvormen bijkomen moet ik ze niet bijprogrammeren in m'n flash file maar wordt de klasse gewoon automatisch opgeroepen

sorry als het nogal verwarrend is uitgelegd :)

BernardV
%Europe/Berlin %630 %2007, 16:07
Waarom zou je het zo willen? Je kunt toch ook een switch statement gebruiken:

function createClass(classType:String):Object
{
switch(classType){
case "DND":
return new DND(...);
case "TMCC":
return new TMCC(...);
case "MA":
return new MA(...);
}
return null;
}

Het beste is nog een interface maken voor je classes, dan kun je ipv Object het type van je Interface returnen.

duivvv
%Europe/Berlin %637 %2007, 16:17
Waarom zou je het zo willen? Je kunt toch ook een switch statement gebruiken:

function createClass(classType:String):Object
{
switch(classType){
case "DND":
return new DND(...);
case "TMCC":
return new TMCC(...);
case "MA":
return new MA(...);
}
return null;
}

Het beste is nog een interface maken voor je classes, dan kun je ipv Object het type van je Interface returnen.

ja i know

maar als er dan nog een pak oefenvormen bijkomen mag ik ze allemaal handmatig toevoegen in die case, en omdat de argumenten van de klasse hetzelfde zijn bij elke oefenvorm leek het me makkelijker om het gewoon in 1 regel te kunnen schrijven (nuja ... 2 ofzo ;) )

maar het is dus niet mogelijk ?
of toch iemand die een oplossing weet

BernardV
%Europe/Berlin %649 %2007, 16:35
Maar je zult altijd je code moeten aanpassen, want je moet die nieuwe classes ook compilen in je code..
Dus dit is net zo makkelijk :)
Gewoon een ClassCreator class aanmaken met een static functie createClass("DND",[argumenten]);
Dan hoef je daar alleen maar je code aan te passen en verder gebruik je overal:
var obj:Object = ClassCreator.createClass(waardeuitxml,[arg1,arg2]);

duivvv
%Europe/Berlin %655 %2007, 16:44
Maar je zult altijd je code moeten aanpassen, want je moet die nieuwe classes ook compilen in je code..


daar heb je een punt..
niet aan gedacht

SJB
%Europe/Berlin %544 %2007, 14:03
Ik heb een soort gelijk probleem, maar ik krijg de oplossing met de classcreator niet werkend.

Ik heb de volgende class gemaakt:

import com.CMS.component.*;

class com.CMS.classCreator {

private var obj:Object;

public function classCreator(){
obj = new textfield();
//trace(obj instanceof com.CMS.component.textfield);
}

// PRIVATE
// ________________________________________________


// PUBLIC
// ________________________________________________

//functie om een instance van een class te maken.
public function createClass(Name:String){
//trace("createClass aangeroepen met " + Name);
return new [Name];
}
}

In de class 'layout' maar ik een instance van de classCreator. En in de volgende functie wordt de createClass() aangeroepen.

private function readXML(){
//trace("readXML aangeroepen");
ixemel = layoutXML.firstChild;
for (var i = 0; i<ixemel.childNodes.length; i++) {
if (ixemel.childNodes[i].attributes.type == "component") {

var curComp:Object = C_Creator.createClass(ixemel.childNodes[i].attributes.label);
//trace(curComp instanceof com.CMS.component.textfield);

cNod = ixemel.childNodes[i];
trace("cNod = " + cNod);
var props = cNod.childNodes;
//trace("props = " + props);
}
}
}

waarschijnlijk is het de werking van de createClass functie maar ik wist zo snel niet hoe ik het anders kan doen.

hopelijk kan iemand mij helpen.

SJB
%Europe/Berlin %326 %2007, 08:50
Ik heb het probleem al gevonden en opgelost. Ik verweest naar de class 'textfield' maar dat moest met het hele pad zijn. dus: com.cms.textfield.

nu werkt het wel!