Organizzatore Lunga Gli script in file separati?
-
28-09-2019 - |
Domanda
Nel tentativo di organizzare il mio codice, sto cercando di dividere il mio (lunga) principale classe controller in file separati, ma i miei nuovi file deve comunque avere accesso alle variabili e funzioni di la classe controller principale.
Sto cercando di tagliare e incollare il codice della mia classe controller in un nuovo / file di classe, che consente la classe controller di chiamare la nuova classe, e consentendo la nuova classe di avere accesso a proprietà e la funzione della classe controller.
Supponendo che non sono totalmente contundenti modelli di progettazione appropriate, di seguito è il mio tentativo non riuscito a realizzare questo compito:
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);
}
}
}
nuovo file non ha accesso alla classe Controller - non funziona. come posso scrivere il nuovo file in modo che esso ha accesso alle proprietà, funzioni, stage, ecc della classe Controller, come se il suo codice non è mai stato rimosso ed è ancora al suo posto originale.
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();
}
}
}
Soluzione
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(); } }
Altri suggerimenti
Questo codice
//Call Tracer Function
tracer();
non sta andando al lavoro, in quanto tracciante non è un metodo statico.
Questa:
super.addChild(sq);
non funziona neanche, dal momento che NewFile non eredita tutte le classi; super()
chiama il metodo homonyme della classe madre in una relazione eredità. Che cosa si dovrebbe fare non è più probabilmente una relazione COMPOSIZIONE o AGGREGAZIONE: newFile non è un controller, ma controllore ha un newFile
E 'difficile sapere esattamente ciò che è sbagliato se non ci danno un messaggio di errore.
Sotto l'aspetto di design, sono d'accordo con Patrizio. Si potrebbe voler controllare il composite, che potrebbe essere quello che ti serve lì.