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!
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.