2010-10-07 3 views
0

Dans une tentative d'organiser mon code, j'essaie de diviser ma classe de contrôleur principal (long) en fichiers séparés, mais mes nouveaux fichiers doivent toujours avoir accès aux variables et fonctions de la classe de contrôleur principal. J'essaie de couper et coller du code de ma classe de contrôleur dans une nouvelle classe/fichier, permettant à la classe de contrôleur d'appeler la nouvelle classe, et permettant à la nouvelle classe d'accéder aux propriétés et à la fonction de la classe de contrôleur.Organisation de longs scripts dans des fichiers séparés?

En supposant que je ne suis pas tout à fait matraquer modèles de conception appropriés, ci-dessous est ma tentative infructueuse à l'accomplissement de cette tâche:

package 
{ 
import flash.display.Sprite; 
import flash.events.Event; 

public class Test extends Sprite 
    { 
    public var myString:String; 

    public function Test() 
     { 
     if (stage) 
      init(null); 
      else 
      addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

    private function init(evt:Event):void 
     { 
     if (hasEventListener(Event.ADDED_TO_STAGE)) 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

/////////////// MOVE COMMENTED CODE TO NEW FILE /////////////////////// 
//  
//  //Assign The String A Value 
//  myString = "Hello world"; 
//  
//  //Draw A Blue Square 
//  var sq:Sprite = new Sprite(); 
//  sq.graphics.beginFill(0x0000FF); 
//  sq.graphics.drawRect(10, 10, 100, 100); 
//  sq.graphics.endFill(); 
//  super.addChild(sq); 
//  
//  //Call Tracer Function 
//  tracer(); 
// 
////////////////////////////////////////////////////////////////////// 

     //Call pasted method in NewFile.as 
     NewFile.myNewFunction();  // <- this doesn't work 
     } 

    public function tracer():void 
     { 
     trace(myString); 
     } 
    } 
} 

nouveau fichier n'a pas accès à la classe Controller - ne fonctionne pas. comment puis-je écrire le nouveau fichier pour qu'il ait accès aux propriétés, fonctions, étapes, etc. de la classe Controller, comme si son code n'avait jamais été supprimé et était toujours à son emplacement d'origine.

package 
{ 
public class NewFile 
    { 
    public static function myNewFuntion():void 
     { 
     //Assign The String A Value 
     myString = "Hello world"; 

     //Draw A Blue Square 
     var sq:Sprite = new Sprite(); 
     sq.graphics.beginFill(0x0000FF); 
     sq.graphics.drawRect(10, 10, 100, 100); 
     sq.graphics.endFill(); 
     super.addChild(sq); 

     //Call Tracer Function 
     tracer(); 
     } 
    } 
} 
+0

semble que vous avez rencontré l'anti-modèle "The God class" – Allan

Répondre

3
 
public class MainClass extends Sprite 
{ 
    private var subClass:SubClass; 

    public function MainClass 
    { 
     var controller:Controller = new Controller(); 

     subClass = new SubClass(controller); 
     addChild(subClass); 
    } 

    private function init():void 
    { 
     subClass.doWhatever(); 
    } 
} 

public class Controller 
{ 

    public function doThis():void 
    { 
    } 
    public function doThat():void 
    { 
     trace("controller do that..."); 
    } 
    public function doSomethingElse():void 
    { 
    } 
} 

public class Subclass extends Sprite 
{ 
    private var controller:Controller; 

    public function Subclass(controller:Controller) 
    { 
     this.controller = controller; 
     trace("new Subclass instance!"); 
    } 

    public function doWhatever():void 
    { 
     controller.doThat(); 
    } 
} 
+0

cela ne fonctionne pas puisque je veux également utiliser les propriétés et les fonctions de la superclasse à l'intérieur des fonctions de la sous-classe. Peut-être qu'il y a une approche plus directe? peut-être utiliser une classe statique qui peut être appelée à partir de ma classe de contrôleur, bien que je ne sache pas encore si je serai capable d'utiliser des méthodes et des variables de la classe de contrôleur dans la classe statique. – TheDarkIn1978

+0

J'ai édité ma question pour que ce que j'essaie de faire soit plus clair. – TheDarkIn1978

+0

Vérifiez la réponse éditée ... C'est une façon de s'y prendre, mais il y a d'autres options. Je ne pense pas que c'est une bonne conception d'avoir une sous-classe accédant aux propriétés et méthodes de la classe principale, c'est pourquoi j'utilise la classe Controller, mais cela reste un exemple basique ... Essayez de voir quelques patterns de design Avoir une chance. – PatrickS

2

Ce code

//Call Tracer Function 
tracer(); 

ne va pas travailler, car traceur est pas une méthode statique.

Celui-ci:

super.addChild(sq); 

ne fonctionnera pas non plus, puisque NewFile ne hérite pas de classe; super() appelle la méthode homonyme de la classe mère dans une relation d'HÉRITAGE. Ce que vous devriez faire ici est plus probablement une relation de COMPOSITION ou d'AGRÉGATION: le nouveau fichier n'est PAS un contrôleur, mais le contrôleur a un nouveau fichier.

Il est difficile de savoir exactement ce qui ne va pas si vous ne nous donnez pas de message d'erreur.

Sur le plan de la conception, je suis d'accord avec PatrickS. Vous pourriez vouloir vérifier le modèle composé, qui pourrait être ce dont vous avez besoin là.

+0

ouais, je pense que j'ai essayé tout ce que je pouvais à ce sujet.Ce qui aurait pu fonctionner est de définir les propriétés et les fonctions nécessaires à ma classe newFile comme étant statiques, mais le problème était que ma classe de contrôleur principal est une classe de document, qui doit également avoir ces propriétés et fonctions comme non statiques. Je fais un gâchis et je vais battre en retraite. merci pour l'entrée. – TheDarkIn1978