2009-07-22 4 views
1

En ActionScript, tous les constructeurs doivent être publics. Parfois, cependant, il n'est pas possible de permettre à un utilisateur de créer une nouvelle instance d'une classe (puisque la classe peut être liée à des ressources système physiques, des sockets réseau, etc.).Simulation d'un ctor interne dans ActionScript?

Est-ce que anyony sait s'il existe un moyen de rendre une classe non-créative dans ActionScript? Essentiellement, ce que je vise est:

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

Je suppose que je pourrais contourner ce problème en définissant une interface et la mise en œuvre dans une classe interne, mais que tout ne se sent pas bien pour moi:

internal class ClassImpl implements ISomeClass 
{ 
    . . . 
} 

Suggestions?

Répondre

1

ouais, l'astuce argument de sécurité ... :)

il est un bon début, mais avec un nombre simple, il ne lancer des erreurs d'exécution, si vous passez en nombre (plus il y a une chance de 1/2^64 que vous devinez le bon nombre ...: D) ... utilisez ceci, si vous voulez avoir des erreurs de compilation aussi (une chose stupide est que vous ne pouvez pas définir un type pour être non -nullable, donc nul sera toujours un argument valable):

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(); 
} 

une autre approche est, pour créer une interface publique MyPrivateConstrClass et une classe privée/interne MyPrivateConstrClassImpl et un autre plaisir ction qui va instancier MyPrivateConstrClassImpl, mais laissez la valeur de retour de cette fonction soit de type MyPrivateConstrClass ... il est un peu exagéré, mais 100% compilation et exécution en toute sécurité ...

greetz

back2dos

+1

Vous pourriez simplifier cette implémentation en ayant simplement un champ statique privé de type Object et en effectuant une vérification strictement égale (===). –

+0

oui et non ... le but de cette approche est, que vous ne pouvez pas transmettre de valeur valide au ctor, puisque TestEnforcer est une classe privée ... il y a toujours bien sur null ... – back2dos

1

Voici une solution où a magic number is needed pour qu'un constructeur fonctionne. J'espère que cela pourrait être utile.

+0

Le lien semble down atm. Je pensais à cela moi-même, mais je ne voulais pas encombrer le ctor avec un paramètre «magique». Merci – cmroanirgo