2009-07-22 11 views
1

In ActionScript müssen alle Konstruktoren öffentlich sein. Manchmal ist es jedoch nicht möglich, einem Benutzer das Erstellen einer neuen Instanz einer Klasse zu erlauben (da die Klasse möglicherweise an physische Systemressourcen, Netzwerk-Sockets usw. gebunden ist).Simulieren eines internen Ctor in ActionScript?

Weiß anyony, ob es eine Möglichkeit gibt, eine Klasse in ActionScript nicht zu erstellen? Im Wesentlichen, was ich bin mit dem Ziel ist:

public class SomeClass 
{ 
    internal function SomeClass():void { } 
    . . . 
} 

Ich glaube, ich durch die Definition eine Schnittstelle dieses Problem umgehen könnte und es in einer internen Klasse Umsetzung, aber das fühlt sich einfach nicht richtig zu mir:

internal class ClassImpl implements ISomeClass 
{ 
    . . . 
} 

Vorschläge?

Antwort

1

ja, das Sicherheitsargument Trick ... :)

es ist ein guter Anfang, aber mit einer einfachen Zahl, wird es nur Laufzeitfehler werfen, wenn Sie in Zahlen übergeben (plus gibt es eine Chance von 1/2^64 dass du die richtige Zahl erraten hast ...: D) ... nutze dies, wenn du auch Kompilierzeitfehler haben willst (eine blöde Sache ist, dass du einen Typ einfach nicht auf non setzen kannst -nullable, so null wird immer ein gültiges Argument sein):

package { 
    public class Test { 
     public function Test(enforcer:TestEnforcer) { 
      if (enforcer == null) throw "haha, good try ... but, no! :P"; 
     } 
     public static function create():Test { 
      //do your cheks here 
      return new Test(TestEnforcer.enf); 
     } 
    } 
} 
class TestEnforcer { 
    public function TestEnforcer() { } 
    public static const enf:TestEnforcer = new TestEnforcer(); 
} 

ein weiterer Ansatz ist, zu schaffen, öffentliche Schnittstelle MyPrivateConstrClass und eine private/interne Klasse MyPrivateConstrClassImpl und anderen Spaß hat ction dass MyPrivateConstrClassImpl instanziiert wird, aber der Rückgabewert dieser Funktion lassen von MyPrivateConstrClass Typ sein ... es ist ein wenig übertrieben, aber 100% der Kompilierung und Laufzeit sicher ...

greetz

back2dos

+1

Sie könnten diese Implementierung vereinfachen, indem Sie einfach ein privates statisches Feld vom Typ Object verwenden und eine streng gleich (===) Prüfung dagegen durchführen. –

+0

ja und nein ... der Punkt dieses Ansatzes ist, dass Sie keinen gültigen Wert an den ctor übergeben können, da TestEnforcer eine private Klasse ist ... es gibt natürlich immer null ... – back2dos

1

Hier ist eine Lösung, wo a magic number is needed für einen Konstruktor zu arbeiten. Hoffentlich könnte das helfen.

+0

Die Verbindung scheint unten atm. Ich habe selbst daran gedacht, aber wollte den ctor nicht mit einem "magischen" Parameter durcheinander bringen. Danke – cmroanirgo

Verwandte Themen