2014-08-28 3 views
1

Я пишу фасад использовать CreateJS LIB в Скале, как этотМожно ли разделить определение объекта в нескольких файлах в scala?

object CreateJS 
{ 
    sealed trait EventListener extends js.Object 

    type EventHandler = js.Function 

    class DisplayObject extends js.Object 
    { 
    } 

    class Container extends DisplayObject 
    { 
     def addChild(item:DisplayObject):Unit = ??? 
     def update():Unit = ??? 
    } 

    @JSName("createjs.Stage") 
    class Stage(canvasId:String) extends Container with EventListener 

    // TODO: Is enum done this way ??? 
    object MovieClip 
    { 
     @JSName("createjs.MovieClip") 
     var INDEPENDENT:String = _ 
     @JSName("createjs.SINGLE_FRAME") 
     var SINGLE_FRAME:String = _ 
     @JSName("createjs.SYNCHED") 
     var SYNCHED:String = _ 
    } 

    @JSName("createjs.MovieClip") 
    class MovieClip(mode:js.String=MovieClip.INDEPENDENT,startPosition:js.Number=0, loop:js.Boolean=true, labels:js.Object = null) extends DisplayObject 
    { 

     def addEventListener(eventName:String, target:EventHandler):Unit = ??? 
     var timeline:TimeLine = _ 
     def gotoAndPlay(where:String):Unit = ??? 
    } 

    class TimeLine extends js.Object 
    { 
     def addTween(tween:Tween):Unit = ??? 
    } 

    @JSName("createjs.Shape") 
    class Shape(graphics:Graphics = null) extends DisplayObject 

    @JSName("createjs.Graphics") 
    class Graphics extends js.Object 
    { 
     def beginFill(color:String):Graphics = ??? 
     def drawCircle(x:js.Number, y:js.Number, r:js.Number):Graphics = ??? 
    } 

    @JSName("createjs.Ticker") 
    object Ticker extends js.Object 
    { 
     def addEventListener(eventName:String, handler:EventHandler):Unit = ??? 
     def addEventListener(eventName:String, stage:Stage):Unit = ??? 
    } 

    class Tween extends js.Object 
    { 
     def get(item:DisplayObject):Tween = ??? 
     def to(state:js.Dynamic, time:js.Number = 0):Tween = ??? 
    } 

    @JSName("createjs.Tween") 
    object Tween extends Tween 


/* Load queue */ 
    class Plugin extends js.Object 

    @JSName("createjs.Sound") 
    object Sound extends Plugin { 
     def play(soundId:String):Unit = ??? 
    } 

    @JSName("createjs.LoadQueue") 
    class LoadQueue(useXHR:Boolean = true, basePath:String="", crossOrigin:String="") extends js.Object 
    { 
     def installPlugin(plugin:Plugin):Unit = ??? 

     def on(event:String, handler:EventHandler):Unit = ??? 

     def addEventListener(event:String, handler:EventHandler):Unit = ??? 

     def loadFile(params:js.Dynamic):Unit = ??? 

     def loadManifest(paramList:js.Array[js.Dynamic]):Unit = ??? 
    } 


} 

Этот файл будет просто большая куча. В реальном createJS они разбиты на 4 файла - мольберт, твин, звук и предварительную загрузку, каждый расширяющий базовый объект createjs. Возможно ли, что я делаю это разделение файлов в scala, сохраняя все в пространстве имен CreateJS?

(Может быть, такой порт уже есть?)

ответ

4

Вы можете разделить код в различных признака, каждый из которых отвечает за когерентной аспект (и сбор соответствующих функций), каждая черта в отдельном файле, то есть общественное одноплодной объект фасада разоблачает все.

Например, с признаком A реализации функции foo и bar в файле A.scala и черте B с функциями oof и rab в файле B.scala, то фасад объект может быть объявлен как object Facade extends A with B.

Таким образом, я бы предложил объявить черту как закрытый, так как они есть только для того, чтобы организовать код: private[mypackage] trait A { ... }.

+0

Согласен, хотя я бы не рекомендовал 'private [mypackage]'. Общественный объект наследуется от признаков, поэтому они не должны быть частными. ИМО тот факт, что такое наследование даже компилируется, является ошибкой. Лучший способ предотвратить злоупотребление этими чертами - объявить их с помощью типа self: 'trait A {this: Facade.type => ...}' – sjrd

+0

Самостоятельный тип не требуется, если другой вызов не требует вызова функции друг друга. – cchantep

+0

На самом деле это невозможно сделать в моем случае, потому что 'Классы, расширяющие js.Any, не могут быть определены внутри класса или признака'. Какие-либо предложения? – roma