Archiv verlassen und diese Seite im Standarddesign anzeigen : Typecasting eines "anonymen" Objects?
xervus,
gibt es eine Möglichkeit, etwas in dieser Art zu implementieren?? :
package control.constants
{
import control.Test1;
import vo.TestVO;
public class TestConstants
{
public static const TEST : TestVO = TestVO( {name : 'Test', priority : 00, reference : Test1} );
// und noch mehr davon...
}
}
TestVO sähe so aus:
package vo
{
import control.interfaces.ITest;
public class TestVO
{
public var name : String;
public var priority : Number;
public var objReference : ITest;
public function TestVO()
{
}
}
}das teil kompiliert einwandfrei und ohne warnung, allerdings bekomme ich einen runtime error (typecast-fehler), wenn ich versuche, das zu verwenden:someManagingObject.someInitMethod( TestVO( TestConstants.TEST ) );
wahrscheinlich bin ich einfach nur blind...
cheers, thomas
Hmm, meiner Meinung nach kann ein anonymes Objekt kann nicht zu einer konkreten Klasse "hochgecastet" werden. Die Tatsache, dass es kompiliert würde ich als Fehler im Compiler verbuchen.
Gruß,
Dirk.
na wunderbar... ole, ole. hast du vielleicht eine andere idee für das folgende szenario (wie oben, hier nochmal in textform...)?
ich möchte folgendes realisieren (cairngorm):
ein teil der applikation besteht aus einer (reihen)folge von einzelnen teilschritten, ich nenn das ganze mal den RequestFlow.
für die verwaltung dieser schritte (die FlowSteps) existiert ein manager, der durch einen zugehörigen FlowInitialiser die einzelnen schritte registriert bekommt.
die schritte selbst implementieren jeweils das selbe interface, IFlowStep, so dass der manager weiss, wie er sie zu verwenden hat.
da das ganze erweiterbar sein soll, hätte ich gerne eine zentrale stelle, an der ich die teilschritte definieren kann, und zwar mit einer reihe von informationen, die für den ablauf wichtig sind: ein identifyer (String), die reihenfolge im prozess (Number) und die verantwortliche Klasse (ein objekt, dass IFlowStep implementiert) diese infor lege ich in einem FlowStepVO als attribute ab.
ich dachte eigentlich, es wäre eine gute idee, dieses "definitions-set" eines teilschrittes in eine klasse auszulagern, so dass ich mittels konstanten weiss, welches objekt gemeint ist, z.b. FlowStepConstants.FAQ -> identifyer='faq', reihenfolge=4, objReference=FAQManagercheerio, thomas
Ok - dann vielleicht so?
package
{
public class FlowStepConstants
{
public static const FAQ:FlowStepVO = new FlowStepVO("faq", 4, faqManager);
}
}
und im VO entsprechend:
package
{
public class FlowStepVO
{
public var id:String;
public var order:int;
public var ref:IFlowStep;
public function FlowStepVO(id:String, order:int, ref:IFlowStep)
{
this.id = id;
this.order = order;
this.ref = ref;
}
}
}
Oder habe ich das falsch verstanden?
Gruß,
Dirk.
Xervus, ähm jein...
ich bin zwar nicht auf die Idee gekommen, bei den Konstanten neue Objekte zu instanziieren... die sollten dann am besten wohl noch Singleton implementieren.
Der Weg ist aber glaube ich gut, allerdings konnte ich faqManager nicht an das VO übergeben, weil es nicht vom Typ IFlowStep ist - ist es aber, es implementiert vollständig das Interface.. komisch.
Ich bin gerade dabei, ein wenig drum herum zu basteln, letztendlich stelle ich gerade fest, müsste ich was ähnliches wie im Cairngorm FrontController implementieren - sozusagen ein Subsystem...
Wahrscheinlich meld ich mich später nochmal ;)
cheers, thomas
Sodele, das Szenario hat sich ein wenig verschoben...
Kann man so etwas realisieren?
public class FlowStepVO
{
/* ... */
/** The class responsible for processing a particular flowStep, must implement IFlowStep */
public var flowStepReference : IFlowStep as Class;
/* ... */
}Allerdings sind Interfaces an der Stelle nicht möglich... es ginge mit : Class, aber das impliziert eben nicht, dass die Klasse IFlowStep implementieren muss. wenn's funzt, poste ich meine lösung ;)
cheers, thomas
Einen Typ (z.B. IFlowStep) kann man nicht als Class casten - genausowenig kann man eine Class auf einen Typ casten.
Oder anders: eine Variable, die als Class typisiert ist, kann nur Objekte vom Typ Class referenzieren, aber keine Instanzen von Class (denn diese haben einen anderen Typ)
Alles klar? :)
Wenn Du zur Kompilierzeit feststellen willst, ob die zur Laufzeit aus einer Class erstellte Instanz einen bestimmten Typ hat, dann lautet die Antwort: geht nicht.
Wenn Du lediglich zur Laufzeit feststellen willst, ob die zur Laufzeit aus einer Class erstellte Instanz einen bestimmten Typ hat, dann lautet die Antwort: geht.
Du musst lediglich das Class Objekt per describeType() analysieren. Ich bin mir allerdings nicht sicher, ob das XML, das describeType() zurückgibt auch die implementierten Interfaces listet...
Im schlimmstenfall musst Du die Class instanzieren, und dann prüfen, also:
var test:ITest = new clazz() as ITest;
if (test is ITest)
{
// alles super
}
else
{
// error!
}
Gruß,
Dirk.
vBulletin® v3.8.3, Copyright ©2000-2013, Jelsoft Enterprises Ltd.