2011-07-14 25 views
7

He estado leyendo un poco sobre el modelo de herencia de coffeescript y tengo la sensación de estar al margen de un debate ideológico que realmente no entiendo. Entonces, estaría perfectamente feliz de descubrir que solo estoy haciendo las cosas de la manera incorrecta.Métodos estáticos y herencia en Coffeescript

Básicamente lo que estoy haciendo es escribir un conjunto de widgets que, entre otras cosas, necesitan manejar eventos en sus elementos DOM. Pensé que una buena forma de hacerlo sería tener un método de clase que se llamaría una vez, para delegar todos los eventos que el widget podría necesitar. La clase de widget base puede tener algunos manejadores de clic simples, mientras que la subclase podría agregar algunos manejadores de mouseover o manejadores de clic extra.

Sin embargo, parece que se supone que no debo intentar hacer el equivalente a llamar a super() dentro de un método estático. Existe una solución que existe, (this.__super__.constructor.METHODNAME()) pero he visto muchas sugerencias de que esta no es la mejor manera de hacer lo que estoy tratando de hacer. ¿Alguien tiene alguna idea de cómo debería estructurar este código? ¿Utilizo la solución alternativa o puse toda la delegación en un lugar totalmente diferente? No puedo simplemente incluirlo en el prototipo, ya que no necesariamente tendré una instancia para llamar al método (o puedo seguir llamando a un método ? en el prototipo de un contexto estático, como poner SwatchableWidget.prototype.delegateEvents() en una función onload o algo

Aquí hay un poco de código para ilustrar lo que estoy hablando:

class Widget 
    @testProp: "ThemeWidget" 
    @delegateEvents: -> 
     console.log "delegate some generic events" 

class SwatchableWidget extends Widget 
    @testProp2 = "SwatchWidget" 
    @delegateEvents: -> 
     console.log "delegate some specific swatchable widget events" 
     this.__super__.constructor.delegateEvents() 

Widget.delegateEvents() 
SwatchableWidget.delegateEvents() 

Gracias por cualquier hel pag.

Respuesta

1

Suena como si quiere un tipo diferente de modelo de herencia en el que cada función heredada de un tipo determinado ("llamada principal") paseará por el árbol de herencia y llamará a todos sus padres con el mismo nombre.

Puede llamar a cualquier función principal directo de cada elemento secundario manualmente como lo haya escrito. Luego flotará en la cadena de herencia en cualquier lugar donde especifiques tal relación.

que sería obligar a la llamada de los padres delegado en el constructor de una función de clase actual

delegateparents => 
    #call any parent class methods 
2

No entiendo por qué delegateEvents sería un método de nivel de clase, o por qué Widget.delegateEvents tiene que ser llamado nuevamente desde SwatchableWidget.delegateEvents. Si se trata de código de inicialización acaba de clase, debe ponerlo en el cuerpo de la clase directamente:

class Widget 
    console.log "delegate some generic events" 
    ... 
    @testProp: "ThemeWidget" 

class SwatchableWidget extends Widget 
    console.log "delegate some specific swatchable widget events" 
    ... 
    @testProp2 = "SwatchWidget" 

I le está esperando a un estado DOM específica antes de ejecutar este código de inicialización? Tal vez podría sugerir otro enfoque si me contaras un poco más sobre las condiciones previas para delegateEvents.

3

Sugiero sustituir

this.__super__.constructor.delegateEvents() 

con

Widget.delegateEvents() 

tratando de usar super para llamar a métodos estáticos no se requiere (y no tiene mucho sentido)

+0

me gusta esto, pero entonces cada clase derivada sería necesario llamar explícitamente que es eventos de clase delegado de padres. Si los nombres de las clases principales están alterados, los eventos delegados y las llamadas similares deberían actualizarse manualmente.Releyendo mi propia respuesta, todavía no sé de una forma clara de llamar automáticamente como funciones nombradas en los padres más allá de lo que sugiere el autor de la pregunta original. –