2011-11-29 2 views
7

CoffeeScriptはすごく面白いですが、クラスシステムは本当にすべてのJavaScript、いくつかのキーワード、さらには少ないproto *と中カッコです。私はクラスでミックスインを実装しているのを見たことがありますが、Javaのインターフェイスに類推するための道があるのだろうかと思います。'implements'を実装しているCoffeeScript

これはいいかもしれません..結局のところ、私のコードがコンパイル時にカモのようにうまく歩くことができるかどうかを知ることは良いことです。以下の手順は、理想的なものを助けるかもしれません...今、あなたはそれを大掛かりなものではないが、それでもいいと思うようにユニットテストを作成することで回避できます。

class definitiona 
class definitionb 

class featurex 
class featurey 

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

答えて

8

一般に、JavaScriptersはJava-ismsのようなインタフェースを拒否します。結局のところ、インターフェースの有用性は、オブジェクトがコンパイル時に「カモのように突っ込む」かどうかをチェックし、JavaScriptはコンパイルされた言語ではないということです。 CoffeeScriptはありますが、インターフェイスを強制するようなものは、その範囲をはるかに超えています。ダーツのようなより厳密なコンパイル・ツー・JS言語は、より多くのあなたの路地かもしれません。一方

あなたはfeaturexfeatureyとしてミックスインをやってみたかった場合、それはかなり一般的とCoffeeScriptの-土地で行うのは簡単だ何か。 classes chapterでご覧になりたい場合は、LittleScript on CoffeeScriptのを参照してください。featurexを、プロトタイプのメソッドをchildaに追加するオブジェクトとして定義します。

1

私は同じ問題を抱えており、方法includesFunctionに追加して解決しようとしました。私はそれをhereと書いた。この解決策では、複数のインターフェイスを実装することができ、instanceof演算子の代わりに使用できるプロトタイプObjectの追加メソッドを提供します(JavaScript演算子をオーバーライドできないため)。

6

私はパーティーに遅刻していることを知っています。私はそれだけで、あなたの開発者のツールボックスのツールだと/なぜこれをしない理由のメリットを主張しませんが、これは、私はそれを行う方法です。

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 

duck.coffee

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

interface.quack.coffee 0

class Duck extends Class @implements iQuack quack: -> console.log 'quack, quack' 

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

関連する問題