2010-12-01 7 views
2

Certaines des classes de niveau supérieur peuvent être instanciées et appelées en tant que fonction (par exemple, new Number() and Number(), new Boolean() and Boolean(), new Array() and Array()).Comment faire en sorte qu'un constructeur de classe soit appelable en tant que fonction?

Habituellement, ceci est utilisé pour la conversion de type ou comme raccourci pour l'instanciation. Je voudrais être en mesure de faire la même chose:

public class Foo 
{ 
    public function Foo():void 
    { 
    //do something 
    } 
} 

public function Foo():Foo 
{ 
    //do some stuff; 
    return new Foo(); 
} 

Est-ce possible? Si c'est le cas, comment?

EDIT pour clarifier:

Ce que je voulais faire était à l'origine pour créer une classe d'enregistrement pour interagir avec Flash/JavaScript et compatible multi-navigateur. Je voulais être en mesure d'utiliser le journal fonction comme un alias d'une méthode dans le journal classe. Cela m'a amené à me demander si je pouvais mettre en œuvre une fonction de moulage personnalisé juste parce que. J'ai maintenant réalisé que ce n'était pas possible, mais c'était amusant de jouer avec quand même.

+1

il devrait fonctionner par défaut. ça s'appelle coulée –

+0

@TiMeister J'espérais pouvoir intégrer une gestion personnalisée. Malheureusement, il semble que ce n'est pas le cas. – zzzzBov

+0

juste curieux, mais qu'est-ce que vous cherchez à réaliser?est-ce plus que d'omettre le mot-clé 'new'? – gthmb

Répondre

1

Vous pouvez définir des classes:

package [package name] 
{ 
    public class Foo 
    { 
    public function Foo():void 
    { 
     //do stuff 
    } 
    } 
} 

Et vous pouvez définir des fonctions:

package [package name] 
{ 
    public function Foo():Bar 
    { 
    return new Bar(); 
    } 
} 

Mais les classes et les fonctions ne peuvent pas avoir des collisions de nommage. Sinon, vous obtiendrez une erreur de script.

Une fonction de coulée personnalisée ne peut pas être définie avec le même nom que la classe, mais il peut être mis en œuvre sous un autre nom:

package [package name] 
{ 
    public function CastFoo(foo:*):Foo 
    { 
    //do stuff 
    return Foo(foo); 
    } 
} 
0

cela est correct:

public class Foo 
{ 
    public function Foo():void 
    { 
    //do something 
    } 
} 

ce n'est pas:

public function Foo():Foo 
{ 
    //do some stuff; 
    return new Foo(); 
} 

si vous Preced Foo avec "nouveau":

new Foo(); 

vous créez une nouvelle instance de Foo classe.

si vous ne le faites pas:

Foo(); 

vous obtenez rien - en fait, vous obtiendrez une erreur de compilation sur les arguments manquants.

si vous passez un seul argument:

var foo:Foo = Foo(bar); 

vous jetteront "bar" comme une instance de Foo. L'objet à lancer doit partager une super classe à lancer. Généralement, il est utilisé pour convertir un type d'objet plus générique en un type d'objet plus spécifique - comme le cast event.target en Sprite, ou un DisplayObject retourné par getChild dans un MovieClip.

+0

@Big MoMo J'espérais pouvoir contourner explicitement le fonctionnement du casting. Ce qui me rendait confus, c'est que la méthode d'aide de 'Array()' pouvait instancier un tableau à partir d'une liste d'arguments, ce qui n'est pas * exactement * la même chose que le lancement d'autres objets. – zzzzBov

+0

@zzz - en réalité, en mode strict, var bob: Array = Array (1, 2, 3) donnera la même erreur. Si le mode strict est désactivé, vous recevrez un avertissement ... mais je sais ce que vous voulez dire - d'autres exemples pourraient être setTimeout ou navigateToURL, qui sont toujours appelés avec des arguments plutôt que comme de nouvelles instances ... je ne sais pas pourquoi ils ont fait le changement avec AS3, comme vous pouvez faire ce que vous avez décrit avec la fonction Objet créé en utilisant des méthodes prototypes - 'nouvelles' forces et instance, sinon il est juste appelé ... de toute façon, question intéressante – momo

+0

@Big MoMo 'setTimeout' et' navigateToURL 'sont des fonctions définies dans le standard ECMA Script, elles sont les mêmes pour JavaScript. Même chose pour la fonction 'Array()', c'est une exception en étant surchargé en tant qu'objet. – zzzzBov

Questions connexes