2011-11-29 12 views
7

CoffeeScript è fantastico, il sistema di classe è davvero tutto javascript di sempre, alcune parole chiave e molto meno proto * e parentesi graffe ovunque. Ho visto persone implementare mix in classi, ma mi chiedo se ci sia un percorso per implementare un'interfaccia analogica con le interfacce Java?CoffeeScript, implementazione 'implements'

In caso contrario potrebbe essere una buona aggiunta. Dopo tutto, sarebbe bene sapere se il mio codice può camminare/ciarlare con successo come un'anatra in fase di compilazione. Le seguenti istruzioni potrebbero aiutare meglio quello che sarebbe l'ideale ... In questo momento puoi aggirare il problema creando test di unità (che dovresti fare comunque) quindi non è un grosso problema, ma sarebbe comunque bello.

class definitiona 
class definitionb 

class featurex 
class featurey 

class childa extends definitiona implements featurex 
class childb extends definitionb implements featurex, featurey 

risposta

8

In genere, gli JavaScript rifiutano gli isistemi Java come le interfacce. Dopo tutto, l'utilità delle interfacce è che controllano se gli oggetti "fanno la cacca come un'anatra" in fase di compilazione e JavaScript non è un linguaggio compilato. CoffeeScript lo è, ma cose come l'enforcing delle interfacce vanno ben oltre il suo scopo. Un linguaggio di compilazione JS come Dart potrebbe essere più adatto alle tue esigenze.

D'altra parte, se si voleva fare featurex e featurey come mixins, questo è qualcosa che è abbastanza comune e facile da fare in CoffeeScript-terre. Puoi dare un'occhiata allo classes chapter in The Little Book on CoffeeScript, che mostra quanto sia facile farlo: basta definire featurex come oggetto i cui metodi si aggiungono al prototipo di childa.

1

Ho lo stesso problema e ho provato a risolverlo aggiungendo il metodo includes a Function. L'ho descritto here. Questa soluzione consente l'implementazione di più interfacce e fornisce un metodo aggiuntivo per il prototipo Object che può essere utilizzato al posto dell'operatore instanceof (poiché non è possibile sovrascrivere alcun operatore JavaScript).

6

So che sono in ritardo per la festa. Non voglio discutere i meriti del perché/perché non farlo in quanto è solo uno strumento nella cassetta degli attrezzi del vostro sviluppatore, ma questo è come lo faccio:

class.coffee

# ref - http://arcturo.github.io/library/coffeescript/03_classes.html#extending_classes 
# ref - http://coffeescriptandnodejs.blogspot.com/2012/09/interfaces-nested-classes-and.html 

# 
# @nodoc 
# 
classKeywords = ['extended', 'included', 'implements', 'constructor'] 

# 
# All framework classes should inherit from Class 
# 
class Class 

    # 
    # Utility method for implementing one of more mixin classes. 
    # 
    # @param objs [Splat] One or more mixin classes this class will *implement*. 
    # 
    @implements: (objs...) -> 
     for obj in objs 
      if typeof obj is 'function' and Boolean(obj.name) 
       obj = obj.prototype 

      for key, value of obj #when key not in moduleKeywords 
       # Assign properties to the prototype 
       if key not in classKeywords 
        #console.log 'implementing', value.toString(), 'as', key 
        @::[key] = value 

      obj.included?.apply(@) 
     this 

    # 
    # Utility method for adding getter/setters on the Class instance 
    # 
    # @param prop [String] The name of the getter/setter. 
    # @param desc [Object] The object with a getter &/or setter methods defined. 
    # 
    @property: (prop, desc)-> Object.defineProperty @prototype, prop, desc 

interface.quack.coffee

class iQuack 
    quack: -> throw new Error 'must implement interface method' 

duck.coffee

class Duck extends Class 
    @implements iQuack 

    quack: -> console.log 'quack, quack' 

https://gist.github.com/jusopi/3387db0dd25cd11d91ae