個別のファイルで長いスクリプトを整理する?
-
28-09-2019 - |
質問
コードを整理しようとして、(長い)メインコントローラークラスを別々のファイルに分割しようとしています。 しかし 私の新しいファイルは、メインコントローラークラスの変数と関数に引き続きアクセスする必要があります。
コントローラークラスからコードを新しいクラス/ファイルにカットして貼り付けて、コントローラークラスが新しいクラスを呼び出すことができ、新しいクラスがコントローラークラスのプロパティと機能にアクセスできるようにしようとしています。
私が適切な設計パターンを完全にblするわけではないと仮定して、以下はこのタスクを達成するための私の失敗した試みです。
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);
}
}
}
新しいファイルには、コントローラークラスにアクセスできません - 機能しません。コントローラークラスのプロパティ、機能、ステージなどにアクセスできるように、新しいファイルを書き込むには、コードが削除されず、元の場所にあるかのように。
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();
}
}
}
解決
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(); } }
他のヒント
このコード
//Call Tracer Function
tracer();
Tracerは静的な方法ではないため、機能しません。
これです :
super.addChild(sq);
NewFileはクラスを継承しないため、機能しません。 super()
継承関係における母クラスの同性愛者方法を呼び出します。そこにすべきことは、おそらく構成または集約関係です。NewFileはコントローラーではありませんが、コントローラーにはNewFileがあります。
エラーメッセージが表示されない場合、何が悪いのかを正確に知ることは困難です。
デザインの側面については、私はパトリックに同意しなければなりません。複合パターンを確認することをお勧めします。これは、必要なものである可能性があります。
所属していません StackOverflow